纯虚拟函数和多重继承
Pure virtual functions and multiple inheritance
我有一个(有保证的树形)类级联,比如
class rock_bottom {
...
virtual foo() = 0;
};
class A : rock_bottom {...}
class intermediate: rock_bottom {...}
class B : intermediate {...}
class higher_up {...}
class C : higher_up {...}
我想在字母类A、B、C中实现foo()。我需要在哪里声明foo?(虚拟?纯?)我是否需要在中间层、中间层和上层实现(琐碎)?
问题:
我想在字母类A、B、C中实现foo()。我需要在哪里声明
foo
?(虚拟?纯?)
答案:
这个问题需要反过来问。在哪个基类中创建接口foo
是有意义的。让我们学习一些您可能在应用程序中找到的类。
struct Shape {};
struct Rectangle : public Shape {};
struct Square : public Rectangle {};
struct Ellipse : public Shape {};
struct Circle : public Ellipse {};
所有Shape
都能够返回其面积和周长,这是有道理的。因此,您将它们作为virtual
成员函数放在Shape
中。
struct Shape
{
virtual double area() const = 0;
virtual double perimeter() const = 0;
};
在创建Shape
子类型的实例之前,必须实现它们。
如果您希望能够创建Rectangle
,那么这些函数必须在Rectangle
中实现,因为没有其他中间类。
如果希望能够创建Square
,则必须在Rectangle
、Square
或两者中实现这些功能。
类似地,如果您希望能够创建Ellipse
,那么这些函数必须在Ellipse
中实现,因为没有其他中间类。
如果希望能够创建Circle
,则必须在Ellipse
、Circle
或两者中实现这些功能。
然而,只有Rectangle
具有长度和宽度。只有Ellipse
具有大半径和小半径。在Shape
中添加虚拟成员函数以返回这些值是没有意义的。
问题:
我是否需要在中间层、中间层和高层实现(琐碎的)?
答案:
不,你没有。上一个问题的答案应该进一步澄清这一点。
每个覆盖都需要在实现它的类中声明;在您的情况下,A
、B
和C
,因为您说每个都将提供覆盖。
没有必要在任何中间类中声明它,假设你很乐意它们保持抽象。它们从rock_bottom
继承了纯函数,没有必要用另一个纯函数来覆盖它。
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承导致虚假的模糊虚拟函数过载
- 带有此指针的模板类多重继承构造函数不起作用?
- 仅函数的多重继承 - 没有虚拟和 CRTP
- 从多重继承中的派生类函数调用适当的父类函数
- C++具有多重继承的构造函数重载解析
- 指针到成员函数和多重继承
- 使用具有虚拟多重继承的基构造函数
- 多重继承:调用所有覆盖的函数
- 具有虚拟多重继承的构造函数定义
- 实现具有多重继承的纯虚函数
- 多重继承析构函数调用他自己和父析构函数?c++
- 没有匹配的函数调用CTOR,多重继承
- 具有多重继承的纯虚函数重载和协变返回类型
- 多重继承、复制构造函数和基类初始化
- 在多重继承(菱形)中,祖父的默认构造函数称为
- 继承受保护的函数和公共变量C++时发生多重继承编译错误
- 纯虚拟函数和多重继承
- c++多重继承函数合并
- C++ 多重继承:函数不匹配