如何访问受保护的基类函数,从派生类通过基类ptr
How to access protected base class function, from derived class through base class ptr
我有抽象类A,从中继承了许多类。在派生类中,我试图通过指针访问受保护的函数。但是我得到一个编译错误。
class A
{
protected:
virtual void f()=0;
};
class D : public A
{
public:
D(A* aa) :mAPtr(aa){}
void g();
protected:
virtual void f();
private:
A* mAPtr; // ptr shows to some derived class instance
};
void D::f(){ }
void D::g()
{
mAPtr->f();
}
编译器错误提示:不能访问在类A中声明的受保护成员A::f。
如果我声明mAPtr为D*,而不是A*,一切都编译。我不明白为什么会这样
依赖于private
访问对相同类型的不相关实例有效。
依赖protected
访问可以在相同类型(以及更多派生类型)的不相关实例上工作。
但是,依赖于protected
访问,不能在不相关的基类型实例上工作。
[n3290: 11.5/1]:
派生类的友元或成员函数类引用受保护的非静态成员函数或protected在基类的非静态数据成员中应用访问检查除了前面第11条所述的之外。除了成型时指向成员(5.3.1)的指针,必须通过指针进行访问对派生类本身(或任何类)的对象的引用或引用派生自该类)(5.2.5)。如果访问是为了形成一个指针对于成员,嵌套名称说明符应命名派生类(或(从该类派生的任何类)
所以D
或者从D
衍生出来的东西,而不是A
。
这是c++中一个经常被质疑的可爱的奇怪之处,尽管如此,它还是被设计成试图避免陷阱。毕竟,您不知道*mAPtr
真正的类型是什么。
包含protected section的类意味着该类允许派生类以他们选择的任何方式操作它们的基类(只要受保护的接口允许)。
类D对象可以操作它们自己的A部分。在这样做的过程中,他们可能想要保持一些不变量。
假设存在(或将来会有!)另一个类E,也继承自A。类E对象也可以操作它们自己的A部分,并且它们可能强制不同的不变量。
现在,如果一个类D对象被允许操作任何对象的a部分,它就不能保证不变量。一个D对象可能会对E对象的A部分做一些事情,从而破坏了E对象。这就是为什么它是不允许的。
但是如果你真的想,也许有一种方法可以调用a::f,而不暴露给所有人,那就是通过朋友函数。
class A;
namespace detail
{
void call_f(A*);
}
class A
{
friend void detail::call_f(A*);
private:
virtual void f() = 0;
};
namespace detail
{
void call_f(A* a) { a->f(); }
}
class D: public A
{
public:
void g() { detail::call_f(mAPtr); }
private:
void f() {}
A* mAPtr;
};
这依赖于用户足够自律,远离名称空间,其名称清楚地表明它包含实现细节。
您忘记在类声明后使用;
:
class A
{
protected:
virtual void f()=0;
};
class D : public A
{
public:
void g();
protected:
void f();
private:
A* mAPtr; // ptr shows to some derived class instance
};
此外,不需要存储基类指针
- 指向基类派生类的 std::unique_ptr 的指针
- 从多个模板化基类派生时出现"隐藏重载的虚函数"警告
- 从模板基类派生是否在派生类声明的点实例化模板
- 使从一个基类派生的类能够使用继承的受保护成员
- C++多态性访问基类派生类字段
- C++派生类的设置属性到从同一基类派生的未知类对象
- 使用void* 参数定义纯虚函数的抽象基类.派生类匹配参数是指向某种类型的指针
- 在C++中,如何使用将保存从基类派生的任何对象的类成员
- 如何测试从依赖于外部系统的外部基类派生的类
- 如何从模板基类派生非模板类
- 在派生类中使用声明并不能隐藏从基类派生的相同函数
- 从具有静态结构的基类派生
- 具有从 c++ 中的非模板基类派生的模板类的事件系统
- C++ 调用从基类派生的覆盖函数
- 不清楚如何在从抽象基类派生的类中实现运算符重载
- 如何正向声明从正向声明的模板基类派生的类
- 是否可以从 std::enable_shared_from_this 和抽象基类派生
- 多态性c++,试图访问从抽象基类派生的类的成员函数
- C++多重继承,基类派生自同一类
- 基类派生类访问-如何