Re[2]: Виртуальные свойства в C++
От: commando Россия  
Дата: 08.09.06 16:00
Оценка:
Здравствуйте, deadlight, Вы писали:

D>Вот работающий пример


Самое интересное: если в этом примере обращаться к свойству через указатель на базовый класс, то оно ведет себя вполне полиморфно!!! При этом я не определял заново свойство в производном классе и даже не определял свойство как вирутальное!

#include "stdafx.h"
#include <iostream>

class A
{
private:
  __int64 TestValue;
public:
  __declspec(property(get=getVal, put=setVal)) __int64 Val;
  virtual void setVal(__int64 v)
  {
    TestValue = v;
  }
  virtual __int64 getVal()
  {
    std::cout << "from base" << std::endl;
    return TestValue;
  }
};

class B :public A
{
public:

  __declspec(property(get=getVal, put=setVal)) __int64 Val;
  __int64 getVal()
  {
    std::cout << "from inherited" << std::endl;
    return -1;
  }
};

int _tmain(int argc, _TCHAR* argv[])
{
    A * ptr = new B();
    if (ptr->Val == -1)
    {
        printf("success");
    }
    return 0;
}


Такое впечатление, что при обращении через точку свойство встраивается get из того класса, в котором определено свойство, а через указатель — из таблицы виртуальных функций...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.