想象
class A
{
public: virtual void f() = 0;
};
class B
{
public: virtual void f() = 0;
};
class C : public A,B
{
public: virtual void f()
{ // implementation here
}
};
C c();
Run Code Online (Sandbox Code Playgroud)
这似乎可以编译。(没有尝试编译我的示例,而是更复杂的现实生活场景)。
我有点惊讶它实际上可以编译。我本来会抱怨(在 C 的实例化时),因为我只实现了一种抽象基本方法。(尽管他们有相同的名字。)
这是否像我期望的那样工作(假设函数 f 在两个基数中具有相同的含义)或者是否有任何陷阱?
最令人烦恼的解析再次出现(你打开编译器警告了吗?):
C c();
Run Code Online (Sandbox Code Playgroud)
是一个函数声明,因此没有构造对象。c无论如何,如果你声明为,就不会有任何歧义
C c;
Run Code Online (Sandbox Code Playgroud)
因为两个纯虚函数将被最派生的C::f().
如果你要写类似的东西,就会产生歧义
class A
{
public: void f() {}
};
class B
{
public: void f() {}
};
class C : public A,B
{
public:
};
int main() {
C c;
c.f(); // Need to call a base one, but which one?
}
Run Code Online (Sandbox Code Playgroud)
错误:在不同类型的多个基类中找到成员“f”
| 归档时间: |
|
| 查看次数: |
1683 次 |
| 最近记录: |