|
|
|
|
class T
{
public:
virtual void print() = 0;
};
|
Возможно ли такое обьявление:
void T::print()
{
cout << "12345";
}
|
если нет, то почему нельзя | |
|
|
|
|
|
|
|
для: rty
(01.04.2007 в 13:58)
| | Можно... Не смотря на то, что класс абстрактный, следовательно, объект данного класса объявить нельзя, а в классах-наследниках придётся перегрузить метод print(), так как он виртуальный, обратиться к виртуальному методу print() класса T всё же можно
#include <iostream>
using namespace std;
class T
{
public:
virtual void print() = 0;
};
void T::print()
{
cout << "12345";
}
class B:T
{
public:
void print();
};
void B::print()
{
T::print();
}
int main()
{
B obj;
obj.print();
return 0;
} |
Однако перегружать метод в производном классе всё равно придётся. | |
|
|
|
|
|
|
|
для: cheops
(01.04.2007 в 14:35)
| | если можно, то почему в книгах пишут что у функции нет тело | |
|
|
|
|
|
|
|
для: rty
(01.04.2007 в 14:39)
| | Если тела не реализовывать, то не будет :))) правда объявление прототипа без реалзации возможно не только для виртуальных функций, но и вообще для всех функций программы. Задача чисто виртуального метода - потребовать переопределение метода в производном классе (например, в Java, PHP для этого используются интерфейсы)...
Приведённый выше пример, является демонстрацией того, как не следует поступать - так как мы при помощи "хитрости" просто пытаемся (не до конца) из чисто-виртуальной функции сделать просто виртуальную функцию. Такой "хитрый" код является признаком плохо тона. Да возможно (специально проверил в Builder, VC++ и GCC), но лучше так не поступать. Традиционно для чисто виртуальных методов в базовом классе не определяют реализации вообще, а реализуют их в производных классах. | |
|
|
|