C++ 从c+;中的派生类调用虚拟基函数时删除或引发编译器错误+;

C++ 从c+;中的派生类调用虚拟基函数时删除或引发编译器错误+;,c++,oop,c++11,polymorphism,virtual-functions,C++,Oop,C++11,Polymorphism,Virtual Functions,我有以下代码: class A { public: virtual void f(int a) = 0; virtual void f(int a, int b) = 0; }; class B : public A { public: // do not want f(int a,int b) accessible void f(int a); }; class C : public A { public:

我有以下代码:

 class A
 {
 public:
      virtual void f(int a) = 0;
      virtual void f(int a, int b) = 0;
 };

 class B : public A
 {
 public:
      // do not want f(int a,int b) accessible
      void f(int a);
 };

 class C : public A
 {
 public:
      // do not want f(int a) accessible
      void f(int a, int b);
 };

我知道不能删除纯虚拟函数。有没有办法禁用这些函数,从而在B的实例尝试调用f(int,int)或C的实例尝试调用f(int)时发生编译时错误。您需要更复杂的类层次结构。大概是这样的:

class A
{
public:
  virtual ~A() {}
};

class BaseForB : public A
{
public:
  virtual void f(int a) = 0;
};

class BaseForC : public A
{
public:
  virtual void f(int a, int b) = 0;
};

class B : public BaseForB
{
public:
  void f(int a) override
  {
    // details...
  }
};

class C : public BaseForC
{
public:
  void f(int a, int b) override
  {
    // details...
  }
};
class A
{
 public:
     virtual void f(int a) = 0;
     virtual void f(int a, int b) = 0;
};

class A_B : public A {
    using A::f;
private:
    void f(int a, int b) final override {}
};

class B : public A_B
{
public:
    // do not want f(int a,int b) accessible
    void f(int a);
};

一个选项是将一个类放在B和a之间,该类实现了函数的私有版本,该函数是最终版本,不能由B的实例调用,如下所示:

class A
{
public:
  virtual ~A() {}
};

class BaseForB : public A
{
public:
  virtual void f(int a) = 0;
};

class BaseForC : public A
{
public:
  virtual void f(int a, int b) = 0;
};

class B : public BaseForB
{
public:
  void f(int a) override
  {
    // details...
  }
};

class C : public BaseForC
{
public:
  void f(int a, int b) override
  {
    // details...
  }
};
class A
{
 public:
     virtual void f(int a) = 0;
     virtual void f(int a, int b) = 0;
};

class A_B : public A {
    using A::f;
private:
    void f(int a, int b) final override {}
};

class B : public A_B
{
public:
    // do not want f(int a,int b) accessible
    void f(int a);
};

你的意思是检测而不是删除(在问题标题中)?它们都是纯虚拟的,因此需要实现它们。如果您试图实例化B或C,这就是编译错误。如果从
A
接口(
bb;A&A=B;A.f(4,2);
)调用它,会发生什么情况?
virtual
的本质是,您不必在编译时知道在给定的调用站点实际调用哪个函数。编辑:也许您想要实现
A::f(int)
A::f(int,int)
,以便它们抛出、终止或执行其他操作。这样,尝试用一个不提供它的实例调用它是可以被检测到的。这似乎是错误的。B和C在这里都不是A。把一个接口分成两个不同的接口怎么样?