Pages

Saturday, August 29, 2009

C++ стандарт: ну уж очень теоретический вопрос

Книги Маерса всегда слишком затериотеризированы. В том смысле, что эфективность его С++ делает дизайн красивым, но, зачастую, непонятным, "скрывающим" очень важные вещи, "мешающим" оптимизировать програмный код, лишающим возможности ускорить выполнение программы, а то и возможности быстро вносить в нее изменения.

Это, конечно, мое частное мнение.

Это в его книгах я нашел объяснение что такое скрытое наследование классов - private inheritance:
class A {};
class B : private A {}

Я даже пробовал использовать применять эти знания на практике. И практика показала, что нужно быть проще. Тогда и программа понятней. Например, практикующий програмист не ожидает увидеть частное наследование в комерческой програме. А в спешке, еще и будет сходить с ума - почему это public переменная недоступна? Как, например, здесь:
#include <iostream>
using namespace std;

class A
{
public:
int x;

A() : x(0) {};
};

class B : private A
{
public:
B() : A() { x = 1; };
};

int main()
{
A a;
B b;
cout << "A a.x = " << a.x << endl;;
cout << "B b::a.x = " << b.x << endl;
return 0;
}

Компилятор "говорит":
error C2247: 'A::x' not accessible because 'B' uses 'private' to inherit from 'A'

И, конечно, Скотт Маерс показывает как это можно "победить":
#include <iostream>
using namespace std;

class A
{
public:
int x;

A() : x(0) {};
};

class B : private A
{
public:
using A::x;
B() : A() { x = 1; };
};

int main()
{
A a;
cout << "A a.x = " << a.x << endl;;

B b;
cout << "B b::a.x = " << b.x << endl;

B* pB = new B;
pB->x = 2;
cout << "B* pB->x = " << pB->x << endl;
delete pB;

return 0;
}

Я не знаю зачем это нужно. Но это существует. Кто знает, может и прогодится когда-нибудь.

No comments:

Post a Comment