多个基类可以有相同的虚方法吗?
Can multiple base classes have the same virtual method?
- class A有一个纯虚方法
read()
- class B 有一个已实现的虚方法
read()
- 我有一个 class C 继承了 A 和 B
- 这会发生吗?
我想要实现的是两个碱基 classes A 和 B 相互补充。
所以 C read()
方法实际上会调用 class B read()
class A {
virtual int get_data() = 0;
void print() {
log(get_data());
}
}
class B {
virtual int get_data() {
return 4;
}
}
class C : public A, public B {
}
C my_class;
my_class.print(); // should log 4;
我不在电脑上也没有机会在接下来的几周内进行测试,所以我无法对此进行测试...但我正在设计架构并且需要知道这是否可行以及是否可行.. 这怎么能实现!
Can multiple base classes have the same virtual method?
- Can this happen?
是的。
So C read() method would actually call class B read()
这不会自动发生。 base 的成员函数不会覆盖不相关的 base 的函数。
您可以为 C
添加覆盖:
class C : public A, public B {
int get_data() override;
}
这会覆盖 A::get_data
和 B::get_data
。为了”实际调用class B read()”,你确实可以这样调用:
int C::get_data() {
return B::get_data();
}
或者...如果您没有声明 B::get_data
私有,那是可能的。
如果您稍微更改层次结构,则可以在不显式委派派生 的情况下覆盖另一个基中的函数。特别是,您需要一个公共基础和虚拟继承:
struct Base {
virtual int get_data() = 0;
};
struct A : virtual Base {
void print() {
std::cout << get_data();
}
};
struct B : virtual Base {
int get_data() override {
return 4;
}
};
struct C : A, B {};
- class A有一个纯虚方法
read()
- class B 有一个已实现的虚方法
read()
- 我有一个 class C 继承了 A 和 B
- 这会发生吗?
我想要实现的是两个碱基 classes A 和 B 相互补充。
所以 C read()
方法实际上会调用 class B read()
class A {
virtual int get_data() = 0;
void print() {
log(get_data());
}
}
class B {
virtual int get_data() {
return 4;
}
}
class C : public A, public B {
}
C my_class;
my_class.print(); // should log 4;
我不在电脑上也没有机会在接下来的几周内进行测试,所以我无法对此进行测试...但我正在设计架构并且需要知道这是否可行以及是否可行.. 这怎么能实现!
Can multiple base classes have the same virtual method?
- Can this happen?
是的。
So C read() method would actually call class B read()
这不会自动发生。 base 的成员函数不会覆盖不相关的 base 的函数。
您可以为 C
添加覆盖:
class C : public A, public B {
int get_data() override;
}
这会覆盖 A::get_data
和 B::get_data
。为了”实际调用class B read()”,你确实可以这样调用:
int C::get_data() {
return B::get_data();
}
或者...如果您没有声明 B::get_data
私有,那是可能的。
如果您稍微更改层次结构,则可以在不显式委派派生 的情况下覆盖另一个基中的函数。特别是,您需要一个公共基础和虚拟继承:
struct Base {
virtual int get_data() = 0;
};
struct A : virtual Base {
void print() {
std::cout << get_data();
}
};
struct B : virtual Base {
int get_data() override {
return 4;
}
};
struct C : A, B {};