Наследование виртуальных функций-членов с тем же именем - PullRequest
2 голосов
/ 03 февраля 2011
class A
{
A() {};
virtual ~A() {};
virtual void Start() {};
virtual void Start(float a) {};
};

class B : public A
{ };

class C : public A
{
virtual void Start(float a) {};
}


...
B BObj;
BObj.Start(); // -> fine, no complain from g++
...

...
C CObj;
CObj.Start(); // -> not fine -> error: no matching function for call to ‘C::Start()’
...

Я подозреваю, что проблема в том, что обе виртуальные функции имеют одинаковое имя, но разные сигнатуры параметров.Я хотел бы знать, что это сообщение об ошибке, специфичное для g ++, как оно реализовано в vtable, или это ошибка, основанная на стандарте C ++.

Ответы [ 5 ]

5 голосов
/ 03 февраля 2011

Функция перегрузки скрывает все остальные функции Start.Чтобы использовать их, добавьте using A::Start:

class C : public A
{
public:
using A::Start;
virtual void Start(float a) {};
}

Также сделайте Start общедоступным в A тоже.

Редактировать: Здесь вы можетевыяснить, почему производный класс скрывает функции базового класса.

0 голосов
/ 04 февраля 2011

когда вы перегружаете функцию в другом классе, всегда вызывайте перегруженную функцию, если вы ее еще вызываете.например

class A()
{
    void start();

};
class B:public A
{
   void start();
   void Start();{A::start}//this function call it's father function
}
void main()
{
  A a;
  B b;
  a.start();//call own function,start() in A.
  b.start();//call is own function,start() in B.
  b.Start();//call start() in A.
}
0 голосов
/ 03 февраля 2011
class A
{
public:
    A() {}
    virtual ~A() {}

    virtual void Start() {}
    virtual void Start(float a) {}
};

class B : public A
{
};

class C : public A
{
public:
    using A::Start;
    virtual void Start(float a) {}
};

int main ()
{
    B BObj;
    BObj.Start();

    C CObj;
    CObj.Start ();
}
0 голосов
/ 03 февраля 2011

Вы пытаетесь позвонить Start() на CObj.Но такой функции нет, потому что единственной определенной функцией является перегруженная Start(float a), которая принимает параметр float.

Точно так, как говорит компилятор.

Если функция Start()объявлен в классе C, вызов этой функции должен быть в порядке.Он может быть объявлен как виртуальный и не может быть определен / реализован.

Надеюсь, это поможет.

0 голосов
/ 03 февраля 2011

Перегрузка для Start в C скрывает все перегруженные версии Start из A. Если вы не пытались перегрузить Start в A [то есть Start0 (), Start1 (float)], вы бы не увидели эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...