首先道歉,如果这是一个新手问题,但我是初学者。 我的问题是我相信钻石问题的一个变种。
想象一下,我有以下课程:
class A{ public: virtual foo();};
class B{ public: foo();};
class C{ public: foo();};
class D: public A, public B, public C{
public: foo();
};
我的问题是,是否可以从班级foo()
拨打D
并让虚拟功能在A
,B
,C
和{{ 1}}。我试过这个,但D
函数会覆盖所有其他d::foo()
函数。
或者只有你做1:2的继承方案才有可能吗?
foo()
我问的原因是因为我希望能够在不同的类中构建class A{ public: virtual foo();};
class B: public A { public: foo();};
class C: public B { public: foo();};
class D: public C { public: foo();};
,A
和B
,而不必每次都构建C
或A
或B
但保留运行虚拟功能的可能性,而无需针对每个案例C
,A::foo()
,B::foo()
进行调用。
答案 0 :(得分:0)
您必须实施课程D::foo
,明确调用A::foo()
,B::foo()
和C::foo()
。没有办法让它在每个父类上自动调用foo()
。
答案 1 :(得分:0)
这称为功能重载,因此您无法自动执行所需操作。
你必须这样做:
#include <iostream>
class A {
public:
virtual void foo() {
std::cout << "foo of A\n";
}
};
class B {
public:
// virtual keyword is not needed,
// but it's to write it so that you
// remind the reader that foo is virtual
virtual void foo() {
std::cout << "foo of B\n";
}
};
class C {
public:
virtual void foo() {
std::cout << "foo of C\n";
}
};
class D : public A, public B, public C {
public:
virtual void foo() {
A::foo();
B::foo();
C::foo();
std::cout << "foo of D\n";
}
};
int main()
{
D d_object;
d_object.foo();
return 0;
}
但是,我强烈建议您阅读此answer,因为您可能会收到:
has virtual method..but not virtual constructor
通常警告明智地被视为真正的错误,因为它们通常会暴露逻辑错误。