我有这个:
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;
}
我收到类似“纯虚函数“ Base :: Draw”没有替代程序”的错误。我认为问题在于Derived_2具有两个Draw()函数,其中之一是虚拟的。但是,我不知道如何在未在Derived_2类中添加包装函数Draw()的情况下解决此问题。有可能吗?
[当您赋予Derived_2
类多个继承(即,它继承自Base
和 Derived_1
时)时,您是说它继承了both基类的成员函数。] >
在这种情况下,这意味着它具有两个(不同的)Draw
成员具有相同的签名。因此,从Draw
派生的纯虚拟Base
函数将not
Derived_1
派生的函数覆盖。实际上,如果按照建议使用Derived_3* d = new Derived_3();
代替第一行main()
,您仍然会收到“无法使抽象类错误”错误,以及“绘制错误地访问Draw”的另一行()“。
您的注释行,void Draw() { Derived_1::Draw(); };
类中的Derived_2
做两件事:(1)解决了以后从Draw()
类对Derived_2
的任何调用中的歧义; (2)它提供了对Draw
类的纯虚拟Base
函数的可行替代。
这两个Draw
功能是不同的,尽管名称和签名相似。他们也可以有两个不同的名字。 Base
和Derived_1
无关,因此Derived_1
的Draw
无法覆盖Base
的。
我认为您的问题是,您将d定义为“ Base”类,而不是“ Derived_3”类,因此,即使您使用了metadata_3构造函数,编译器仍会在“ Base”下寻找draw的定义。
您有2个具有相同名称和参数的函数,这永远都不好。请尝试更改Draw()
函数之一的名称,或者,如果您确实想要相同的名称,请使Derived_1
继承自Base