удаление или выдача ошибки компилятора при вызове виртуальной базовой функции из производного класса в c ++ - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть следующий код:

 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)

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Один из вариантов - поместить класс между AB и A, который реализует закрытую версию функции, которая является окончательной и не может вызываться экземплярами B, например:

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);
};
0 голосов
/ 23 ноября 2018

Нет способа сделать это.Вам нужна более сложная иерархия классов.Как то так:

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...
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...