我想知道当你正在操作的对象存储在一个类(而不是指针或引用类型)中时,C ++中的多态如何工作。
我已经读过多态性只能用于指针和引用,但是我已经超载了<<<<<<<运算符,它将引用A。
在我的实现中测试这个例子时,我发现它没有按预期工作,并将返回基类字符串(" A")而不是" B"。
这是因为对象存储在类本身中吗?并且<<参与运算符与多态性的工作无关? (即因为它的核心对象存储在类中,除非我将它作为指针/引用存储在类中,否则它将无法工作) 感谢
class Test {
public:
void Run() {
object_ = B();
std::cout << object_ << std::endl;
}
private:
A object_;
};
Class A {
// Assume this is already implemented. All it does it add obj.getType()
// to stream
friend ostream& operator<<(ostream& stream, A obj);
public:
virtual std::string getType() {
return std::string("A");
}
};
Class B : public A {
public:
std::string getType() {
return std::string("B");
}
};
int main(int argc, char* argv[]) {
Test test = Test();
test.Run();
}
答案 0 :(得分:2)
你班上有A
个对象,所以当你这样做时:
object_ = B();
RHS上的B
对象被切片。见object slicing。这与作为类成员的对象无关,可以用更简单的示例来说明:
int main()
{
B b;
A a;
a = b;
std::cout << a << "\n";
}