Dav*_*vid 3 c++ base-class c++17
我有这个:
class Base {
public:
Base() {};
virtual ~Base() = default;
virtual void Draw() = 0;
};
class Derived_1 {
public:
Derived_1() {};
void Draw() { std::cout << "Draw()" << std::endl; };
};
class Derived_2 : public Base, public Derived_1 {
public:
Derived_2() {};
~Derived_2() {};
//void Draw() { Derived_1::Draw(); }; <<<<<===--- This works well
};
class Derived_3 : public Derived_2 {
public:
Derived_3() {};
~Derived_3() {};
};
int main()
{
Base* d = new Derived_3();
d->Draw();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到了一个错误,比如“纯虚函数“Base::Draw”没有覆盖”。我认为问题是 Derived_2 有两个 Draw() 函数,其中一个是虚拟的。但是,我不知道如何在 Derived_2 类中添加包装函数 Draw() 来解决这个问题。是否可以?
当你给你的Derived_2类多重继承(即它从Base 和 派生Derived_1)时,你是说它从两个基类继承了成员函数。
在这种情况下,这意味着它有两个(不同的)Draw成员具有相同的签名。因此,纯虚Draw衍生自功能Base将不会由衍生自被重写Derived_1。
事实上,如果你按照建议使用Derived_3* d = new Derived_3();代替你的第一行main(),你仍然会得到“无法实例化抽象类”错误,再加上另一个类似“Draw() 的错误访问”的错误。
您void Draw() { Derived_1::Draw(); };在Derived_2类中注释掉的行做了两件事:(1)它解决了以后任何Draw()来自Derived_2类的调用中的歧义;(2) 它提供了Draw对Base类的纯虚函数的可行覆盖。