【发布时间】:2017-06-08 01:57:09
【问题描述】:
让我们考虑两个类A 和B,其接口如下:
class A {
public:
virtual void start() {} //default implementation does nothing
};
class B {
public:
void start() {/*do some stuff*/}
};
然后是从两者继承的第三个类,A 公开,因为它实现了这个“接口”,而B 私下,因为那是实现细节。
然而,在这个特定的实现中,start() 只需要包含对B::start() 的调用。所以我想我可以使用快捷方式并执行以下操作:
class C: public A, private B {
public:
using B::start;
};
并完成它,但显然它不起作用。所以我得到using 私有基本函数不能工作以覆盖虚拟。由此,有两个问题:
- 有什么方法可以使这项工作像我认为的那样有效吗?
- 为什么编译器会接受此代码为有效代码?正如我所看到的,现在
C中有两个具有完全相同签名的start()函数,但编译器似乎很好,只调用A::start()。
编辑:一些精度:
- 目标是通过
A指针来操作C对象。 - 我目前正在使用一个只调用
B::start()的简单函数,我特别想知道 using 声明是否确实可以“覆盖”虚拟,如果不能,如何允许这两个函数共存。李> - 为了简单起见,我可能省略了
virtual继承之类的一些内容。
【问题讨论】:
-
不清楚你在期待什么。
C c; c.start();应该调用B::start()。 -
它在这里工作:ideone.com/e71lnB
-
@Rama 我想这更多是关于 A* a = &c; a->开始();为您的 ideone 样本
-
您在寻找
void C::start() override { B::start(); }吗? -
@curiousguy 嗯,既然你这么说,我可能确实用错了这个词。使用指令仅适用于命名空间的东西,我应该使用的是“使用声明”。谢谢。
标签: c++ overriding virtual-functions using-declaration private-inheritance