Is-没有虚函数 c++ 的关系
Is-a relationship without virtual functions c++
我找不到没有虚函数的is-a关系的例子。以下模式可以吗?
class Base {
public:
void doSomethingWithX() {/*implementation here*/}
protected:
~Base(){}
private:
int x_;
};
class Derived : public Base {
//Add some other functionality but inherit doSomethingWithX and its implementaion
public:
void doSomethingWithY();
~Derived(); //And document that nobody should inherit further from this class.
private:
int y_;
};
foo(Base* ptr) {
//Do something via Base interface
}
Derived d;
foo(&d);
编辑:我被要求澄清我所说的"这种模式可以吗"是什么意思。 这种继承是否满足了通常从 is-a 关系中需要的东西?利斯科夫替代原理等 通过指向 Base 的指针使用派生对象是否安全?(或者我在这里错过了一些问题(。
我之所以问这个问题,是因为经常有人写到基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的。但我从未遇到过没有非虚函数的公共继承的真实例子。
你在这里做的事情没关系;您可以将指针传递给Derived
并且可以很好地绑定到Base
指针。不可能说它是否满足 Liskov 替换原理,因为我们不知道你的类的不变量。
只要认识到没有任何虚函数,你就无法使用多态性。这不仅仅是覆盖函数行为;您将永远无法执行指向Base
指向Derived
的指针的dynamic_cast
。
此外,如果没有人应该从Derived
派生,则将其标记为final
,自 C++11 起可用
有两种类型的多态性,都可以在C++中实现:静态和动态。后者是你通过虚函数和指向基类的指针得到的,其中的行为是专门的,取决于指向的对象的真实类型。 前者可以通过编写模板来实现,其中假定模板类型具有某些接口。然后,编译器将在编译时实例化模板时强制执行。您可以使用 SFINAE 和/或static_asserts提供额外的强制措施,以确保使用的类型"是"或更确切地说符合代码使用的模板化接口。请注意,除了上述方法之外,实际上没有一种直接的方法可以像基接口类一样定义此接口。
请注意,静态多态性是你在编译时得到的。运行时没有动态选择的类型。为此,您需要某种形式的基类。
相关文章:
- C++GTKMM gui循环依赖关系
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- Doxygen - 如何在不生成图形的情况下生成文本调用关系结果
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 在 c++ 中对字符串进行操作的关系运算符无法按预期工作
- 如何记住这种递归关系?
- 如何在头文件中声明类模板(由于循环依赖关系)
- 移动语义和深层/浅层复制之间有什么关系?
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 对在不同二进制文件中创建的对象文件的依赖关系
- #include < conio.h> 和 getch() 方法之间的关系是什么?
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- OpenVINO - 推理库插件 libMKLDNNPlugin.so 无法解析依赖关系
- 模拟测试中类的依赖关系
- 关于记忆后这种递归关系的时间复杂度
- C++模板方法中的循环依赖关系
- 解析正交模块的依赖关系
- 超市管理系统的类别之间应该是什么关系?
- glMapBufferRange(..) 中的偏移量关系和 glDrawArraysInstanced(..) 中的第一
- 如何在 Mac OS 上安装 boost-mpi 及其对 clang 的依赖关系?