#include <iostream>
#include <string>
struct Printable abstract
{
friend std::ostream& operator<<(std::ostream& cout, const Printable& obj)
{
obj.print(cout);
return cout;
}
virtual void print(std::ostream& cout) const = 0;
};
struct VirtualBase abstract : public Printable
{
//stuff
};
struct Named abstract : public Printable
{
std::string name;
void print(std::ostream& cout) const
{
cout << "Name: " << name;
}
};
struct DerivedA : public VirtualBase
{
void print(std::ostream& cout) const
{
cout << "DerivedA";
}
};
struct DerivedB : public VirtualBase, public Named
{
void print(std::ostream& cout) const
{
cout << "DerivedB";
dynamic_cast<const Named*>(this)->print(cout);
//Is there a better way to call Named::print?
}
};
由于 DerivedB 继承了 VirtualBase 和 Named,并且它们都继承了 Printable,所以我不能将 DerivedB 与 cout 一起使用。在继承层次结构的多层上获得 Printable 支持的最佳方法是什么?另外,在派生类的打印中调用 Named::print 的最简单方法是什么?
最佳答案
问题是因为DerivedB
是 VirtualBase
(这是一个 Printable
)和一个 Named
(这是一个 Printable
),所以 operator<<
尝试转换 DerivedB
到 Printable
, 但不能沮丧,因为它是两个 Printable
对象,它不知道要向下转换到哪个对象。因为你只想要 DerivedB
从一个派生Printable
对象,你必须使用虚拟继承。
normal inheritance: virtual inheritance:
Printable Printable Printable
| | / \
VirtualBase Named VirtualBase Named
\ / \ /
DerivedB DerivedB
这很简单:
struct Named abstract : virtual public Printable
struct VirtualBase abstract : virtual public Printable
请注意,具有虚拟继承的类比没有虚拟继承的类更大,稍微更慢,但另一方面,C++ 是极少数能够做到这一点的语言之一所有。
关于c++ - 在具有多层继承的结构中设置 cout 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9575576/