Рассмотрите следующие 2 программы.C++: вызов чистой виртуальной функции из функции-члена того же класса
#include <iostream>
using std::cout;
class Base {
public:
virtual void f()=0;
void g() {
f();
}
virtual ~Base() { }
};
class Derived : public Base
{
public:
void f() {
cout<<"Derived::f() is called\n";
}
~Derived() {}
};
class Derived1 : public Base
{
public:
void f() {
cout<<"Derived1::f() is called\n";
}
~Derived1() { }
};
int main() {
Derived1 d;
Base& b=d;
b.g();
b.f();
}
компилирует & бежит отлично и дает ожидаемый результат ..
#include <iostream>
using std::cout;
class Base {
public:
virtual void f()=0;
Base() {
f(); // oops,error can't call from ctor & dtor
}
};
class Derived : public Base
{
public:
void f() {
std::cout<<"Derived::f() is called\n";
}
};
int main() { Derived d; Base& b=d; b.f(); }
выше программа терпит неудачу в компиляции. Почему разрешено вызывать чистую виртуальную функцию из функции-члена того же класса, в которой объявлена чистая виртуальная функция? Хорошо ли это сделать или это неопределенное поведение, потому что производный класс по-прежнему не обеспечивает реализацию чистой виртуальной функции? Почему нельзя вызывать чистую виртуальную функцию из конструктора & деструктора того же класса? Я знаю, что конструкторы класса Derived могут вызывать чистые виртуальные функции базового класса. Что говорит об этом стандарт C++?
Связанный: http://stackoverflow.com/q/962132/3093378 – vsoftco
@vsoftco: эта ссылка обсуждает разную тему. – Destructor
Второй ответ касается чего-то очень похожего, не то же самое, поэтому я сказал, что это связано. – vsoftco