我有一个包含很多课程的图书馆。我想修改某个类的一个虚方法的行为。我试图简化,我已经得到了,这里是:
#include <iostream>
using namespace std;
class B;
class A {
public:
A(B& b_) : b(b_) {};
B& b;
virtual void printon() {
cout << "Test virtual printon A\n" << endl;
}
void print() {
cout << "Test print A\n";
printon();
}
};
class B {
protected:
A a;
public:
B() : a(*this) {};
void print() {
a.print();
};
};
在我的程序中,我可以使用它:
int main() {
B* b = new B();
b->print();
return 0;
}
实际上,方法a.printon()
是从其他一些代码和不同条件调用的,并且不会打印任何内容(它会执行其他一些操作)。我需要覆盖此方法以执行其他操作,例如print“test2”。
我可以创建派生类newA
:
class newA : public A {
public:
newA(B& b_) : A(b_) {};
virtual void printon() {
cout << "Test printon newA"<< endl;
}
};
我不确定,接下来该怎么做。也许创建一个类newB
,如:
class newB : public B {
public:
newB() : B() {};
};
但如何使B.a
类型的A
与newA
类型相同?
答案 0 :(得分:2)
B
按值包含A
,这排除了使用多态性(如果您尝试将newA
设置为A
对象,则会获得对象切片。您希望B
能够使用{(1}}的衍生版本,您需要通过(智能)指针存储它。