c++ - 在具有多层继承的结构中设置 cout 支持

标签 c++ cout

#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 的最简单方法是什么?

最佳答案

问题是因为DerivedBVirtualBase (这是一个 Printable )和一个 Named (这是一个 Printable ),所以 operator<<尝试转换 DerivedBPrintable , 但不能沮丧,因为它是两个 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/

相关文章:

C++虚函数定义

c++ - 有没有办法在 C++ 中制作无锁 "counter"随机访问迭代器?

C++标准输出格式

c++ - 我程序的标准输出的 setbase(16) 在哪里被调用?

c++ - 避免在 hpp 文件中暴露私有(private)成员变量

c++ - 我正在尝试使用堆解决将 k 个排序数组合并到单个数组中的问题

c++ - 如果对象在堆栈上, "this"指的是什么?

c++ - 在 cout 之后调用 scanf

c++ - 尝试将 std::cerr 重定向到文件时出现访问冲突异常

c++11 和 boost_filesystem cout 和 printf 不起作用