Информация об изменениях

Сообщение Re[7]: Множественное наследование интерфейсов от 14.06.2018 5:51

Изменено 14.06.2018 5:54 Максим Рогожин

Re[7]: Множественное наследование интерфейсов
Здравствуйте, AlexGin, Вы писали:

AG>Ещё раз подчеркну: неоднозначности для компилятора — не будет, компилятор такой код успешно проглотит.


А как компилятор будет определять где в vtbl какой метод находится? Вот, например:

class Interface1 {
public:
   virtual ~Interface1() {}         // vtbl[0]
   virtual void doSomething() = 0;  // vtbl[1] 
   virtual void doSomething1() = 0; // vtbl[2] = void doSomething1()
   
};

class SomeClass : public Interface1,
                  public Interface2
{
public:
   ~SomeClass();                      // vtbl[0]
   void doSomething1() override;      // vtbl[1] = void doSomething1()
   void doSomething2() override;      // vtbl[2]
   void doSomething() override;       // vtbl[3]
   //...
};

std::unique_ptr<Interface1> obj1(new SomeClass());
obj1->doSomething1(); // как компилятор определяет где в vtbl находится метод doSomething1()?

// метод doSomething1() в Interface1 - это vtbl[2]
// но в классе SomeClass метод doSomething1() - это уже vtbl[1]


Как компилятор определяет сгенерировать какой код сгенерировать?
call vtbl[2]; // такой?
call vtbl[1]; // или такой?
Re[7]: Множественное наследование интерфейсов
Здравствуйте, AlexGin, Вы писали:

AG>Ещё раз подчеркну: неоднозначности для компилятора — не будет, компилятор такой код успешно проглотит.


А как компилятор будет определять где в vtbl какой метод находится? Вот, например:

class Interface1 {
public:
   virtual ~Interface1() {}         // vtbl[0]
   virtual void doSomething() = 0;  // vtbl[1] 
   virtual void doSomething1() = 0; // vtbl[2] = void doSomething1()
   
};

class SomeClass : public Interface1,
                  public Interface2
{
public:
   ~SomeClass();                      // vtbl[0]
   void doSomething1() override;      // vtbl[1] = void doSomething1()
   void doSomething2() override;      // vtbl[2]
   void doSomething() override;       // vtbl[3]
   //...
};

std::unique_ptr<Interface1> obj1(new SomeClass());
obj1->doSomething1(); // как компилятор определяет где в vtbl находится метод doSomething1()?

// метод doSomething1() в Interface1 - это vtbl[2]
// но в классе SomeClass метод doSomething1() - это уже vtbl[1]


Как компилятор определяет какой код сгенерировать?

call vtbl[2]; // такой?
call vtbl[1]; // или такой?