【发布时间】:2013-05-01 21:15:48
【问题描述】:
我创建了一些代码来重现该问题:
#include "stdafx.h"
#include <iostream>
#include <vector>
class A
{
protected:
int m_X;
public:
A() {
std::cout << "in A ctor" << std::endl;
m_X = 0;
}
virtual void printX(){ std::cout << "in A " << m_X << std::endl; }
};
class B : public A
{
public:
B() {
std::cout << "in B ctor" << std::endl;
m_X = 1;
}
virtual void printX(){ std::cout << "in B " << m_X << std::endl; }
};
class As
{
public:
void AddA( const A &a ){ m_As.push_back( a ); }
void PrintXs()
{
for ( auto a : m_As )
{
a.printX();
}
}
private:
std::vector<A> m_As;
};
int _tmain(int argc, _TCHAR* argv[])
{
As as;
B b;
as.AddA( b );
as.PrintXs();
system("pause");
return 0;
}
这个的输出是:
在演员中
在 B ctor
在A 1
我想要“in B 1”而不是“in A 1”。我确信我对虚拟的理解是有缺陷的。我必须如何更改代码才能调用 B PrintX()?请注意,还有其他类从 A 继承,所以我真的不想编写静态调用。
谢谢。
【问题讨论】:
-
多态需要指针或引用!在
m_As.push_back( a );,a引用的对象被复制构造成一个新的A对象。