【发布时间】:2017-12-09 14:57:48
【问题描述】:
我需要对从 BaseA 继承的对象使用 do_something 的多态性,但我的 D 对象应该有两个名为 enabled 的独立成员。我的意思是 D::changeEnabled() 应该改变 SecondBaseB::BaseA::enabled = 0 和 SecondBaseC::BaseA::enabled = 0 并且这两个成员应该是分开的(不同的)。是否可以具有多态性而不使用虚拟继承?没有virtual public BaseA 我有模棱两可的错误。但是对于虚拟继承,我只有一个BaseA::enabled。
//
// main.cpp
//
#include <iostream>
#include "D.h";
void do_something(BaseA& o) {
o.changeEnabled();
}
int main() {
SecondBaseB b;
SecondBaseC c;
D d;
do_something(b);
do_something(c);
do_something(d);
std::cout « "Hello, World!" « std::endl;
return 0;
}
//
// BaseA.h
//
class BaseA {
protected:
bool enabled;
public:
BaseA();
virtual void changeEnabled() = 0;
};
//
// BaseA.cpp
//
#include "BaseA.h"
BaseA::BaseA() : enabled(true) {
}
//
// SecondBaseB.h
//
class SecondBaseB : virtual public BaseA{
public:
virtual void changeEnabled();
};
//
// SecondBaseB.cpp
//
#include "SecondBaseB.h"
void SecondBaseB::changeEnabled() {
enabled = !enabled;
}
//
// SecondBaseC.h
//
#include "BaseA.h"
class SecondBaseC : virtual public BaseA {
public:
virtual void changeEnabled();
};
//
// SecondBaseC.cpp
//
#include "SecondBaseC.h"
void SecondBaseC::changeEnabled() {
enabled = !enabled;
}
//
// D.h
//
#include "SecondBaseB.h"
#include "SecondBaseC.h"
class D : public SecondBaseB, public SecondBaseC{
public:
virtual void changeEnabled();
};
换个说法。我有以下场景:带有engine 成员的基础抽象类Car。我创建了从 Car 继承的 DieselCar 和 ElectricCar。然后我想创建 HybridCar,它将继承自 DieselCar 和 ElectricCar 并有两个不同的 engines。使用虚拟继承只有一个引擎。如果不使用virtual,我将无法完成以下操作:
void testDrive(Car* c) {
c->drive();
c->drive();
}
HybridCar h;
ElectricCar e;
testDrive(&h);
testDrive(&e)
【问题讨论】:
-
模板和
std::enable_if()是处理此类情况的绝佳工具。 -
如果有两个不同的
enabled成员,你希望do_something(d)做什么? -
使用
virtual基类表示您只需要一个该类型的基对象。既然你想要两个,不要使用虚拟继承。D必须明白有两个基础并采取相应的行动。
标签: c++ inheritance polymorphism