Может ли класс иметь членов виртуальных данных?

class Base{  
    public:  
        void counter();   
    ....   
}

class Dervied: public Base{  
    public:  
        ....  
}

void main()  
{  
     Base *ptr=new Derived;  
     ptr->counter();  
}

Чтобы определить, что указатель базового класса указывает на производный класс и использует производную функцию-член, мы используем "virtual".

Аналогично, можем ли мы сделать производные члены данных "виртуальными"? (член данных является общедоступным)

Ответ 1

virtual является спецификатором функции...

Из стандартных документов

7.1.2 Function specifiers
Function-specifiers can be used only in function declarations.
function-specifier:
inline
virtual
explicit

Таким образом, элемент виртуальных данных не называется.

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

Ответ 2

Нет, но вы можете создать виртуальную функцию, чтобы вернуть указатель на то, что вы называете членом виртуальных данных

Ответ 3

Нет, на С++ нет виртуальных элементов данных.

Ответ 4

Я думаю, что нет, но вы можете имитировать его, используя виртуальные геттеры и сеттер, возможно?

Ответ 5

Чтобы определить, что указатель базового класса указывает на производный класс и использует производную функцию-член, мы используем "virtual".

Это неверно. Мы создаем виртуальные функции, чтобы позволить производным классам предоставлять различную реализацию из того, что предоставляет база. Он не используется для определения того, что указатель базового класса указывает на производный класс.

Аналогично, можем ли мы сделать производные члены данных "виртуальными"? (член данных является общедоступным)

Только нестационарные функции-члены могут быть виртуальными. Элементов данных не может быть.

Вот ссылка с более подробной информацией об этом

Ответ 6

Нет, потому что это разрушит инкапсуляцию множеством неожиданных способов. Все, что вы хотите достичь, можно выполнить с помощью защищенных атрибутов и/или виртуальных функций.

Кроме того, виртуальные функции - это метод отправки (т.е. выбор какой функции будет вызываться), а не выбор места памяти, соответствующего атрибуту member.

Ответ 7

Возможно, вы можете увидеть проблему эквивалентным образом:

class VirtualDataMember{  
    public:  
    ...
}

class DerviedDataMember: public VirtualDataMember{  
    public:  
    ... 
}

class Base{  
    public:  
        VirtualDataMember* dataMember;
        void counter();     
        ...  
}