Цитата:
Цитата Alan85
Только хоть используй virtual тут хоть нет - результат тот же. »
|
вот пример когда есть отличия:
Код:
#include <iostream>
using namespace std;
class A
{
public:
void foo() {cout << "A::foo()\n";}
// функция test_foo не знает, какой именно класс передан аргументом.
// она просто получила некоторый интерфейс, одинаковый для всех наследников
friend test_foo(A& a) {a.foo();}
} ;
class C
{
public:
C(A& a) {a.foo();}
} ;
class B : A, C
{
public:
B() : A(), C(*this){/**/}
void foo() {cout << "B::foo()\n";}
} ;
main()
{
A a;
B b;
test_foo(a); // вызов одной функции с разными реализациями foo()
test_foo(b);
cin.get();
}
Внимание вопрос! в классе B функция foo вызывается 2 раза. Каждый раз результаты разные.
Испльзования класса хранилища (auto или в свободной памяти) не влияет на правила полиморфизма и построения классов, поэтому через operator new() и указатели не было смысла переделывать
Цитата:
Цитата Alan85
A подменяет свои виртуальные функции »
|
Это то понятно, это на случай, когда оно всё гладко. А вот рассмотрим случай использования недостроенного класса. Рассмотрим конструктор класса (пример сделан специально, чтобы достигнуть нужного эффекта)
Код:
struct B : A, C
{
// порядок вызова:
// 1. A::A()
// 2 С::C(A&) - подкласс A уже построен, но B:A,C ещё нет
// 3 тело B::B()
B() : A(), C(*this)
{
}
void foo() {cout << "B::foo()\n";}
}
Верно ли, что по правилам C++ в случае использования недостроенного класса с виртуальными функциями будут использоваться реализации уже достроенных подклассов либо, в случае использования чистых виртуальных функций, выводится сообщение об ошибке на усмотрение компилятора (например обращение по адресу 0x00000000)
~либо~
Верно ли что использовать недостроенные классы категорически нельзя, реализация поведения остаётся на усмотрение компилятора.
Я ни того, ни другого утверждения ещё не встречал