C++11 C++;使函数在子类中不可用

C++11 C++;使函数在子类中不可用,c++11,inheritance,C++11,Inheritance,我有一个被继承的复杂父类。现在,我只需要重写它的一些函数,并希望以某种方式防止调用子对象中父类的一些未重写函数的可能性(这些来自父类的函数将无法正常工作)。如果有必要的话,我稍后会对它们进行定义,只是想说明一下,它们目前不可用,但仍然继承了一些函数以使多态性成为可能。有可能实现吗?还是我需要改变设计 下面是一个小例子: class ParentClass { public: virtual void write() { ... } virtual void read() { ..

我有一个被继承的复杂父类。现在,我只需要重写它的一些函数,并希望以某种方式防止调用子对象中父类的一些未重写函数的可能性(这些来自父类的函数将无法正常工作)。如果有必要的话,我稍后会对它们进行定义,只是想说明一下,它们目前不可用,但仍然继承了一些函数以使多态性成为可能。有可能实现吗?还是我需要改变设计

下面是一个小例子:

class ParentClass
{
public:
    virtual void write() { ... }
    virtual void read() { ... }
    virtual void calculate() { ... }
};

class ChildClass : public ParentClass
{
public:
    void calculate() override { ... }
};
我想防止从
ChildClass
对象调用
read
write
函数的可能性,因为这些函数定义起来很复杂,我现在不需要它们。但同时我想阻止某人在
ChildClass
中使用父继承函数。重要的是,
父类在第三方库中定义,我无法更改父类


我(笨拙)的想法是覆盖这些函数并加入它们,使其变得明显,它们是不可访问的,但它离正确的设计还很远。。。什么是合适的解决方案?

从来都不需要编写这样的代码,我现在无法尝试这种解决方案,所以请对此持保留态度

我认为您可以在子类中将它们声明为
deleted
,同时在基类中将它们保持为虚拟。当您试图在子类的对象上使用它时,这将提示编译时错误。也就是说,在子类中:

void write = deleted;
void read = deleted;
不幸的是,我不能100%确定这在虚拟函数上是否有效。如果没有,您还可以尝试从父类中的那些函数中删除
virtual
关键字,并在具有已删除函数的子类中使用普通重载,如上所述,甚至只声明它们而不定义它们(我更喜欢已删除的函数,因为它们更显式)。同样,这将提示编译时错误。不过,您当然会失去多态性的优势


让我知道这些解决方案是否有效。

当您想使用类的一部分来实现一个新类,您想使用继承,但不想公开基类的整个API时,一种方法是使用私有继承,然后选择要转发的内容

下面是一个例子:

#include <stdio.h>

class ParentClass
{
public:
    virtual void write() { printf("write"); }
    virtual void read() { printf("read"); }
    virtual void calculate() { printf("calculate"); }
    virtual void other() { printf("other"); }

};

class ChildClass : private ParentClass
{
public:
    void calculate() override { printf("new calculate"); }
    using ParentClass::other;
};

int main() {
    ChildClass c;
    c.calculate();
    c.other();
}

使用ParentClass::other的
语法(用于从基类转发函数而不做任何更改)仅为C++11,您没有标记函数C++11,因此我不知道您是否可以使用:),但是它很方便

在子类中缺少virtual关键字。实际上,只要我使用覆盖说明符,就不需要virtual。你应该将它们标记为
受保护的
,而不是
公共的
。然后,它们只能在子类的实现中调用,而不能从使用子类实例的人处调用。您可以使用父类的非公共继承,例如,您可以执行
类ChildClass:private ParentClass
。这使得
ChildClass
的用户无法“看到”它派生自父类。例如,他们将无法从
父类
调用公共函数,也无法将
子类
传递给接受
父类&
@jendker的函数。我想我要做的是使用私有继承,然后显式转发我想要成为公共的函数。谢谢Andrea!我尝试了这个方法,但发现了错误:删除的函数“write”无法覆盖未删除的函数dded C++11标志:)谢谢!遗憾的是,不可能以另一种方式定义它,也不可能指定哪些函数不被使用,但这是非常不寻常的情况,我想我不得不接受这种情况
.LC0:
  .string "new calculate"
.LC1:
  .string "other"
main:
  sub rsp, 8
  mov edi, OFFSET FLAT:.LC0
  xor eax, eax
  call printf
  mov edi, OFFSET FLAT:.LC1
  xor eax, eax
  call printf
  xor eax, eax
  add rsp, 8
  ret