多重继承:2类1方法
Multiple inheritance: 2Classes1Method
我刚刚尝试了这段代码:
struct FaceOfPast
{
virtual void Smile() = 0;
};
struct FaceOfFuture
{
virtual void Smile() = 0;
};
struct Janus : public FaceOfPast, public FaceOfFuture
{
virtual void Smile() {printf(":) ");}
};
。
void main()
{
Janus* j = new Janus();
FaceOfFuture* future = j;
FaceOfPast* past = j;
future->Smile();
past->Smile();
delete j;
}
它按预期工作(输出两个笑脸),但我认为它甚至不应该编译,重新声明Smile()
Janus
模棱两可。
它是如何(以及为什么)工作的?
没有歧义,因为您在指向FaceOfFuture
的指针上调用Smile()
,并且FaceOfPast
只声明一个方法Smile()
。
不会导致歧义,因此让我们处理直接在子类指针上调用该方法时的情况:
Janus* j = new Janus();
j->Smile();
派生类除了重写之外,还隐藏了基类的Smile()
声明。仅当您不会重写派生类中的方法时,才会有歧义:
以下编译:
struct FaceOfPast
{
virtual void Smile() {printf(":) ");}
};
struct FaceOfFuture
{
virtual void Smile() {printf(":) ");}
};
struct Janus : public FaceOfPast, public FaceOfFuture
{
virtual void Smile() {printf(":) ");}
};
int main()
{
Janus* j = new Janus();
j->Smile();
}
尽管在Janus
上调用Smile
,但基类声明是隐藏的。
以下不会:
struct FaceOfPast
{
virtual void Smile() {printf(":) ");}
};
struct FaceOfFuture
{
virtual void Smile() {printf(":) ");}
};
struct Janus : public FaceOfPast, public FaceOfFuture
{
};
int main()
{
Janus* j = new Janus();
j->Smile();
}
因为模棱两可。
根据C++标准(10.3.2):
如果在类 Base 中声明了虚拟成员函数 vf,并且在直接或间接派生自 Base 的类派生中声明了成员函数 vf,则声明了与 Base::vf具有相同名称、参数类型列表、cv-限定符和 ref-qualifier(或不存在相同)的成员函数 vf,则 Derived::vf [...] 将覆盖 Base::vf。
似乎对多重继承没有任何特殊处理,因此它很可能也适用于这里:void Janus::Smile()
覆盖这两个方法没有任何歧义,只是因为它与两个基类方法具有完全相同的名称和签名。
Janus* j = new Janus();
FaceOfFuture* future = j;
FaceOfPast* past = j;
这部分代码将强制转换为基类。因此,当您执行以下操作时
future->Smile();
past->Smile();
这实际上是指向FaceofPast和FaceOfFuture的指针。
相关文章:
- 如何让qDebug编写方法和类名?
- 在 C++ 中使用模板方法重写类方法
- 如果方法在类中定义,则阻止编译器删除方法
- 我是否应该在包含虚拟方法的类上使用'memcpy'?如果没有,如何替换它?
- 将带有模板化方法的类作为带有GCC的模板参数传递
- 将函数更改为具有设置函数输入变量的方法的类
- 如何在没有虚拟方法的类dynamic_cast指针?
- 如何使用 "get" 方法返回类的私有 std::unique_ptr 成员
- C++详细介绍命名空间 vs 匿名 vs 私有方法到类 vs. pimpl vs. 朋友类
- 基于方法重载类
- 我怎么可能从尚未定义某些成员方法的类创建实例?(C++)
- 如何仅通过类方法修改类公共数据成员
- 如何使用具有相似函数但不同签名的方法设计类
- C++自动吸气器设置方法的类模板 - 好/坏的做法?
- 如何从指针到方法获取类(对象类型)
- 重载方法的类接受模板和基类 - 如何默认某个方法
- 两个具有转换方法的类
- 我们需要对一个只有read方法的类进行线程安全设计吗
- 使用递归方法的类,使用int矢量元素作为输入
- 是否可以通过引用将方法从类传递到全局函数或在类之间传递?