Виртуальные свойства в C++
От: commando Россия  
Дата: 07.09.06 15:59
Оценка:
Добрый день.

Скажите, как сделать свойство в C++ виртуальным (.Net 2003)? Я пытаюсь сделать виртуальными функции-аксессоры:


__declspec (property(get=AngleGet, put=AnglePut)) double Angle;
virtual double AngleGet()
{
    //...
}
virtual void AnglePut(double val)
{
    //...
}


И переопределить их в производном классе, но все равно вызываются функции базоого класса. Объявить само свойство виртуальным не получается, ошибка virtual not permitted with data declarations.

PS. Хочется сделать это способом, наиболее похожим на native-язык.

08.09.06 08:38: Перенесено модератором из '.NET' — Odi$$ey
Re: Виртуальные свойства в C++
От: deadlight Россия  
Дата: 08.09.06 06:23
Оценка: 1 (1)
Здравствуйте, commando, Вы писали:

C>Добрый день.


C>Скажите, как сделать свойство в C++ виртуальным (.Net 2003)? Я пытаюсь сделать виртуальными функции-аксессоры:



C>
C>__declspec (property(get=AngleGet, put=AnglePut)) double Angle;
C>virtual double AngleGet()
C>{
C>    //...
C>}
C>virtual void AnglePut(double val)
C>{
C>    //...
C>}
C>


C>И переопределить их в производном классе, но все равно вызываются функции базоого класса. Объявить само свойство виртуальным не получается, ошибка virtual not permitted with data declarations.


C>PS. Хочется сделать это способом, наиболее похожим на native-язык.


Все просто. Делаешь повторное объявление __declspec (property(get=AngleGet, put=AnglePut)) double Angle;
в наследнике и все

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


#include "stdafx.h"

class A
{
private:
  __int64 TestValue;
public:
  __declspec(property(get=getVal, put=setVal)) __int64 Val;
  virtual void setVal(__int64 v)
  {
    TestValue = v;
  }
  virtual __int64 getVal()
  {
    return TestValue;
  }
};

class B :public A
{
public:
  __declspec(property(get=getVal, put=setVal)) __int64 Val;

  virtual __int64 getVal()
  {
    return -1;
  }
};

int _tmain(int argc, _TCHAR* argv[])
{
  B test;
  test.Val = 1111;
  if (test.Val == -1)
  {
    printf("success");
  }
  return 0;
}


Если из B убрать __declspec(property(get=getVal, put=setVal)) __int64 Val;
будет работать как ты описал.
Re: Виртуальные свойства в C++
От: chabster Украина chabster.blogspot.com
Дата: 08.09.06 08:25
Оценка: 1 (1)
__declspec (property(get=_AngleGet, put=_AnglePut)) double Angle;
double _AngleGet()
{
    return(AngleGet());
}
void _AnglePut(double val)
{
    AnglePut(val);
}
virtual double AngleGet()
{
    //...
}
virtual void AnglePut(double val)
{
    //...
}
Posted via RSDN NNTP Server 2.0
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...
Пока на собственное сообщение не было ответов, его можно удалить.