我想知道当您正在操作的对象存储在类中(而不是作为指针或引用类型)时,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();
}
最佳答案
您的类中有一个 A
对象,因此当您执行此操作时:
object_ = B();
RHS 上的 B
对象被切片。请参阅object slicing 。这与作为类成员的对象无关,可以用一个更简单的示例来说明:
int main()
{
B b;
A a;
a = b;
std::cout << a << "\n";
}
关于c++ - 类成员对象的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12237103/