当前位置: 首页 > 知识库问答 >
问题:

如何使继承的虚函数不可用?

阎星河
2023-03-14

我有一个抽象基类,它声明了一个纯虚函数(< code > virtual method()= 0;)。一些继承的类专门使用这个方法,但是有一个继承的类我不想让这个方法可用。我该怎么做?私有是唯一的选择吗?

共有3个答案

司徒锐进
2023-03-14

我想你可以把它变成一个普通的虚函数,而不是像这样的纯虚函数:

virtual void method() { /* code */ } 

如果这个函数没有在另一个类中使用,您将能够捕获它。例如,您可以警告自己:

virtual void method() { error = true; } //or whatever
孙池暝
2023-03-14

将其设为私有是唯一的选择吗?

不,这根本不是一个选择,因为如果该方法在基类中是公共受保护,您仍然可以访问该方法。

除了在类中实现该方法并求助于运行时故障之外,您没有什么可做的。您可以将整个事情移植到模板中,并使用静态多态,通过进一步的技巧,您可以在某些情况下设计一个编译时故障,但这可能是设计过度。

南门野
2023-03-14

嗯,你可以把它扔出去,这样可以更容易地钉在叫做的地方。

void method() override { throw /* whatever */ ; } 

动态多态性是一个运行时属性。因此会出现运行时错误。如果您关注将在编译时触发的内容,则需要静态多态性。

template<typename Child>
struct Parent {
    void callMe() {
        static_cast<Child*>(this)->callMeImpl();
    }
};

struct SomeChild : Parent<SomeChild> {

};

现在,如果您尝试从 SomeChild 扩展的父级调用 callMe,这将是一个编译时错误。

您也可以像动态多态一样按住指向父函数的指针,因为父函数将调用子函数

 类似资料:
  • FAQs in section [20]: [20.1] 什么是“虚成员函数”? [20.2] C++ 怎样同时实现动态绑定和静态类型? [20.3] 虚成员函数和非虚成员函数调用方式有什么不同? [20.4] 析构函数何时该时虚拟的? [20.5] 什么是“虚构造函数(virtual constructor)”? 20.1 什么是“虚成员函数”? 从面向对象观点来看,它是 C++ 最重要的特征:

  • 在虚继承中,虚基类是由最终的派生类初始化的,换句话说,最终派生类的构造函数必须要调用虚基类的构造函数。对最终的派生类来说,虚基类是间接基类,而不是直接基类。这跟普通继承不同,在普通继承中,派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。 下面我们以菱形继承为例来演示构造函数的调用: 运行结果: m_a=10, m_b=20 m_a=30, m_c=40 m_a=50, m_b=60

  • 假设我有对象:bob1,cob2。我想为类B和C建立一个析构函数,但我不确定如何销毁B.BB和C.CC以及如何访问它们。还有,有没有办法让我做到这一点,而不让类成为a类的朋友?

  • 本文向大家介绍JS继承之借用构造函数继承和组合继承,包括了JS继承之借用构造函数继承和组合继承的使用技巧和注意事项,需要的朋友参考一下 借用构造函数继承  在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术(有时候也叫做伪造对象或经典继承)。这种技术的基本思想相当简单,即在子类型构造函数的内部调用超类型构造函数。 

  • 人们有时会对类成员函数或成员变量的作用域问题感到困惑,尤其是,当基类与派生类的同名成员不在同一个作用域内时: struct B { void f(double); }; struct D : B { void f(int); }; B b; b.f(4.5); // OK // 调用的到底是B::f(doube)还是D::f(int)呢? // 实际情况往往会让人感到意外

  • 本文向大家介绍C++多重继承与虚继承分析,包括了C++多重继承与虚继承分析的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式较为全面的讲述了C++的多重继承与虚继承,是大家深入学习C++面向对象程序设计所必须要掌握的知识点,具体内容如下: 一、多重继承 我们知道,在单继承中,派生类的对象中包含了基类部分 和 派生类自定义部分。同样的,在多重继承(multiple inheritance)关系