C ++ Виртуальные классы: основные вопросы - PullRequest
1 голос
/ 07 декабря 2010
  1. Есть ли разница между virtual public & public virtual?Если да, то почему?
  2. Почему все классы не являются виртуальными?

Пример:

class x { 
   protected: int a; 
};

class y : public virtual x {  
   protected: int b; 
};

Ответы [ 4 ]

2 голосов
/ 07 декабря 2010

Нет, между public virtual и virtual public нет никакой разницы, они являются двумя несвязанными спецификаторами (один определяет видимость отношения наследования, другой определяет, является ли отношение виртуальным или нет), который можно свободно менять.

Существуют семантические различия между виртуальным или нет наследования (если D наследует от B и C, которые оба наследуются от A, то виртуальное наследование означает, что только один экземпляр A будет присутствовать и совместно использоваться как B и C, так и не - виртуальное наследование означает, что будут присутствовать два экземпляра). Иногда вам нужен один экземпляр, иногда - два. Разработчики языка должны были выбрать значение по умолчанию, и было выбрано не виртуальное наследование, поэтому вам нужно явно запросить виртуальное наследование.

0 голосов
/ 07 декабря 2010

Чтобы понять разницу между виртуальной и не виртуальной проверкой наследования (и попытаться понять) код:

#include <iostream>

using namespace std;

struct Base { 
       int a; 
};

struct D11 :    virtual Base    {};
struct D12 :    virtual Base    {};
struct D21 :    Base    {};
struct D22 :    Base    {};

struct E1: D11, D12 {
    std::pair<int, int> func(int i1, int i2){
        dynamic_cast<D11*>(this)->a = i1;
        dynamic_cast<D12*>(this)->a = i2;
        return std::pair<int, int>(dynamic_cast<D11*>(this)->a, dynamic_cast<D12*>(this)->a);
    }
};

struct E2: D21, D22 {
    std::pair<int, int> func(int i1, int i2){
        dynamic_cast<D21*>(this)->a = i1;
        dynamic_cast<D22*>(this)->a = i2;
        return std::pair<int, int>(dynamic_cast<D21*>(this)->a, dynamic_cast<D22*>(this)->a);
    }
};

int main(){
    E1 e1;
    E2 e2;
    std::pair<int, int>  p1, p2;
    p1 = e1.func(1,2);
    p2 = e2.func(3,4);
    cout << "p1: " << p1.first << ", " << p1.second << endl; // Will return p1: 2, 2
    cout << "p2: " << p2.first << ", " << p2.second << endl; // will return p2: 3, 4
    return 0;
}

Это легче понять, если представить это так: alt text

Иногда приятно иметь возможность хранить разные значения переменных в разных базах. Иногда наоборот. C ++ позволяет выбирать.

0 голосов
/ 07 декабря 2010
  1. Нет, насколько я помню. Но предпочтительнее следующее соглашение (ссылка: MSDN)

    виртуальный [спецификатор типа] член-функция-декларатор

    виртуальный [спецификатор доступа] имя базового класса

  2. Следующая ссылка имеет хорошее объяснение приведенного выше примера http://www.parashift.com/c++-faq-lite/multiple-inheritance.html

Для начинающих программистов на C ++ http://www.parashift.com/c++-faq-lite/index.html#table-of-contents служит хорошей отправной точкой

0 голосов
/ 07 декабря 2010

1.) Есть ли разница между const int и int const? нет. 2.) Классы с виртуальными функциями называются полиморфными классами. Я предлагаю вам прочитать здесь: http://www.geekinterview.com/question_details/51645

...