c++ - C类继承B类和A类,B类也继承A类

标签 c++ multiple-inheritance derived-class

我想记录来自基类 B 和派生类 C 的消息,区分哪个类记录了消息:

#include "iostream"

class Logger {
public:
    Logger(std::string name) : name_(name) {}
    void log(std::string msg) { std::cout << name_ << ": " << msg << std::endl; }
private:
    std::string name_;
};

class B : public Logger {
public:
    B() : Logger("Class B" ) {}
    void doSomethingInB() {
        log("B doing something");
    }
};

class C : public B, public Logger {
public:
    C() : Logger("Class C" ) {}
    void doSomethingInC() {
        log("C doing something");
    }
};

int main() {
    B* b = new B();
    C* c = new C();

    b->doSomethingInB(); // I want this to output: Class B: B doing something

    c->doSomethingInC();
    c->doSomethingInB(); // I also want this to output: Class B: B doing something

    return 0;
}

我收到错误“由于歧义 [默认启用],在‘C’中无法访问直接基础‘Logger’”,这是不言自明的。

我可以实现什么不同的模型来做到这一点?

最佳答案

编辑:为了响应您对 c->doSomethingInB(); 需要打印 Class B: B doing something 的要求,请考虑继承之上的组合,因为你需要 B 作为它自己的子类,它的记录器真的和 C 的不一样(除非这里有更多的要求)。示例:

class Logger {
public:
    Logger(std::string name) : name_(name) {}
    void log(std::string msg) { std::cout << name_ << ": " << msg << std::endl; }
private:
    std::string name_;
};

class B {
public:
    B() : logger_("Class B" ) {}
    void doSomethingInB() {
        logger_.log("B doing something");
    }
private:
  Logger logger_;
};

class C : public B {
public:
    C() : logger_("Class C" ) {}
    void doSomethingInC() {
        logger_.log("C doing something");
    }
private:
  Logger logger_;
};

关于c++ - C类继承B类和A类,B类也继承A类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22382351/

相关文章:

c++ - 查找同一年中两个日期之间的天数 (c++)

c++ - 多次调用 ruby​​_init 和 ruby​​_finalize

c++ - 在 C++ 中的 lambda 之外访问 lambda 捕获初始化变量

c# - .NET 中的多重继承有哪些好的替代方案?

C++ 继承 : Can't access private element of base class

c# - 使用派生类在 C# 中进行序列化

c++ - 使用/解析模板时停止编译

c++ - 是否需要从纯抽象类(接口(interface))进行虚拟继承

c++ - 虚拟继承 : Base Ctor not calling in Most Derived Class?

c++ - 是否有另一种方法可以防止调用父类(super class)而不是基类方法(例如使用关键字或其他方法)调用派生方法?