У меня есть простая иерархия классов с базовым классом и производным классом. База имеет два защищенных члена, вызываемых производным классом. Исходя из недавних опытов С#, я подумал, что было бы неплохо сделать интерфейс немного более свободным и позволить цепочку вызовов методов, поэтому вместо вызова this->A()
, затем this->B()
вы можете позвонить this->A()->B()
. Однако следующий код не будет компилироваться:
#include <iostream>
class Base
{
protected:
Base* A()
{
std::cout << "A called." << std::endl;
return this;
}
Base* B()
{
std::cout << "B called." << std::endl;
return this;
}
};
class Derived : public Base
{
public:
void Test()
{
// Base::A and Base::B are private here.
this->A() // This works fine
->B(); // Suddenly I cannot access my own private method?
}
};
int main()
{
Derived d;
d.Test();
return 0;
}
Это приводит к следующей ошибке компилятора:
main.cpp: In member function 'void Derived::Test()':
main.cpp:12:15: error: 'Base* Base::B()' is protected
Base* B()
^
main.cpp:26:21: error: within this context
->B(); // Suddenly I cannot access my own private method?
^
Я также попытался сделать методы базового класса виртуальными, но это не помогло.
Мой С++ достаточно ржавый, и я не могу понять, что здесь происходит, поэтому помощь будет высоко оценена. Также мне было интересно, если это плохая идея, потому что C++ != C#
и С++ - люди не привыкли к таким свободным интерфейсам.