问题描述
|
好吧,我们有以下课程
class A
{
public:
virtual void taco()
{
cout << \"Class A\" << endl;
}
};
class B: public A
{
public:
virtual void taco()
{
cout << \"Class B\" << endl;
}
};
class C : public A
{
public:
void taco()
{
cout << \"Class C\" << endl;
}
};
现在如果我这样做
A a = A();
B b = B();
C c = C();
a.taco(); //Class A
b.taco(); //Class B
c.taco(); //Class C
deque<A> aa = deque<A>();
aa.push_back(a);
aa.push_back(b);
aa.push_back(c);
for(int i=0;i<aa.size();i++)
aa[i].taco();//All Class A
A r = B();
r.taco(); //Class A
现在您会注意到,当我将A初始化为B或C时,它不会触发B或C的功能。我想知道是否有解决办法?我理解这样一个概念,因为对象是A,所以它使用A \的taco函数,但是我只是想知道获取其他函数是否有技巧。我的项目相当复杂,而且我不知道所有将覆盖A的类(由于插件覆盖了一个类)。另外,我还需要基本的虚函数具有一个主体来添加默认行为。谢谢。
解决方法
您必须将指针存储在“ 2”中,因为多态仅适用于引用和指针类型。当您将这些对象插入
deque
中时,副本的类型为A
,将原来使它们变成B
或C
的部分“切”。
同样,A r = B()
只是创建一个临时B
,并将其中的A
部分复制到称为r
的A
中。
顺便说一句by12ѭ,您也可以写下A a;
。它们并不完全等效,但是它们在此处完成相同的工作,您可能想要使用更简单的版本。
A a;
B b;
C c;
a.taco(); //Class A
b.taco(); //Class B
c.taco(); //Class C
// With pointers and containers
deque<A*> aa;
aa.push_back(&a);
aa.push_back(&b);
aa.push_back(&c);
for (int i=0; i<aa.size(); i++)
aa[i]->taco(); // Hurray!
// With refs
B q;
A& r = q;
r.taco(); // Class B!
(请记住,那些对象a
,b
和c
具有自动存储期限。当它们超出范围时,如果deque
仍然存在,则其所有元素都是无效指针。您可能希望使用动态分配来进一步控制对象的生存期。 A
,B
和C
对象..但我将其留给读者练习。)