我想记录来自基类 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/