c语言-字样的继承关系,为什么会提示:无法访问 protected 成员

问题描述

字样的继承关系,为什么会提示:无法访问 protected 成员

#include

using namespace std;

template
class B1
{
public:
void SayHi()
{
T* pT = static_cast(this);

pT->PrintClassName();
}
protected:
void PrintClassName() { cout << "This is B1"; }
};

class D1 : public B1
{
// No overridden functions at all
};

class D2 : public B1
{
protected:
void PrintClassName() { cout << "This is D2"; }
};

int main()
{
D1 d1;
D2 d2;

d1.SayHi();    // prints "This is B1"
d2.SayHi();    // prints "This is D2"

return 0;

}

编译错误:error C2248: “D2::PrintClassName”: 无法访问 protected 成员(在“D2”类中声明)

解决方案

D2 中定义的 PrintClassName,屏蔽了基类中同名的函数。
你在 D2 中又没有实现类似于 B1 中的 SayHi,想直接访问 D2 类中的保护成员 PrintClassName 是不行的。

因为:protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。
但不能被该类的对象访问。

解决方案二:

多谢你的解释!正解~
把D2的protected改成public就对了。

时间: 2024-10-01 10:37:25

c语言-字样的继承关系,为什么会提示:无法访问 protected 成员的相关文章

《C++编程风格(修订版)》——3.3 继承关系

3.3 继承关系 C++编程风格(修订版)现在让我们来看看程序中的继承关系.Stack通过一个保护数据成员vec来为每个派生类提供索引服务,其中vec指向的是一个void类型指针数组.当在派生类中执行入栈和出栈的操作时,Stack将调节私有数据成员top以在数组中移动.在派生类中又分配了一个数组来存储堆栈中的值,并将数组的地址保存在数据成员data中.此外,在派生类中还对vec进行了初始化,这样对于每一个i(只要在数组边界内),vec[i]将指向data[i].从Stack::push()和St

Python中类型关系和继承关系实例详解

  本文详细介绍了Python中类型关系和继承关系.分享给大家供大家参考.具体分析如下: 如果一个对象A持有另一个对象B的ID,那么检索到A之后就可以检索到B,我们就说存在一个A到B的导航.这种导航关系使得Python中所有对象之间形成了一个复杂的网络结构. Python程序的运行包括: 1. 修改这个网络结构; 2. 执行有副作用的代码对象(code object或者说bytecode,见Python Language Reference 3.2) (副作用是指影响Python虚拟机之外的设备

代码重构(五):继承关系重构规则

陆陆续续的发表了多篇关于重构的文章了,还是那句话,重构是一个项目迭代开发中必不可少的一个阶段.其实重构伴随着你的项目的整个阶段.在前几篇关于重构的文章中我们谈到了函数的重构.类的重构.数据的重构以及条件表达式的重构,那么今天咱们就来聊聊继承关系的重构.当然还是延续前几篇博客的风格,我们在博客中的代码实例依然使用Swift语言来实现,当然还是那句话,使用什么语言无所谓,关键是看重构的场景以及重构的思想. "重构"不仅仅可以改善你既有的代码设计,还可以改变你组织代码的思路,使你的程序在设计

PHP中类的继承关系

原文:PHP中类的继承关系 在PHP中,我时常会写一个类,类写了一个共用方法,然后让子类去继承就能得到相应的功能.假设大致有这么一个父类: 1 <?php 2 class Father{ 3 4 public function __construct(){ 5 echo '我是父类的构造方法!'; 6 } 7 8 protected function say($str = 'Hello World!'){ 9 echo '说了一句话:' . $str; 10 } 11 } 12 ?> 然后呢,

对象的继承关系在数据库中的实现方式和PowerDesigner设计

在面向对象的编程中,使用对象的继承是一个非常普遍的做法,但是在关系数据库管理系统RDBMS中,使用的是外键表示实体(表)之间的关系,那么对于继承关系,该怎么在RDBMS中表示呢?一般来说有3种实现方式: Concrete Table Inheritance(具体表继承) Single Table Inheritance(单表继承) Class Table Inheritance(类表继承) 比如在一个教务系统中,有老师学生2个对象,这两个对象都是"人"对象的子类,所以我们可以建立一个P

浅析Hibernate继承关系树的三种映射方式

在向大家详细介绍Hibernate继承关系树的三种映射方式之前,首先让大家了解下Employee类为抽象类,然后全面介绍. 在域模型中,类与类之间除了关联关系和聚集关系,还可以存在继承关系,Company类和Employee类之间为一对多的双向关联关系(假定不允许雇员同时在多个公司兼职),Employee类为抽象类,因此它不能被实例化,它有两个具体的子类:HourlyEmployee类和 SalariedEmployee类.由于Java只允许一个类最多有一个直接的父类,因此Employee类.H

ORM中的继承关系映射全解——单表继承体系、一实体一具体表、一实体一扩展表

ORM中的继承关系映射全解--单表继承体系.一实体一具体表.一实体一扩展表.接口映射 本文涉及的内容包括: 1.单表继承体系 2.一实体一具体表 3.一实体一扩展表 4.接口实现映射vs基类继承映射 1.单表继承体系 所谓单表继承体系就是用一张数据库表存储整个继承体系中的所有实体的数据.单表继承体系适合那种继承体系中实体数目相对较少,总记录数相对较少,子类对父类的属性扩展也相对较少的情形. 单表继承体系优点是读/写继承体系中的每个实体的数据,都只需操作一张表,性能较好,并且,新增继承类,或扩展实

精通Hibernate之映射继承关系八

由于关系数据模型不允许一个表的外键同时参照两个表的主键,因此无法对TABLE_D表的A_ID字段定义外键参照约束,而应该通过其他方式,如触发器,来保证A_ID字段的参照完整性.由于TABLE_D表的A_ID字段既可能参照TABLE_B表的ID主键,也可能参照TABLE_C表的ID主键,要求TABLE_B表和TALBE_C表的ID主键具有相同的SQL类型. 在ClassD.hbm.xml文件中,用元素来映射ClassD的a属性: <any name="a" meta-type=&q

精通Hibernate之映射继承关系七

Company与Employee类之间为一对多多态关联关系,如果继承关系树的根类对应一个表,或者每个类对应一个表,那么就能映射Company类的employees集合.本节介绍如何映射多对一多态关联.如图14-11所示,ClassD与ClassA为多对一多态关联关系. 假定与ClassD对应的表为TABLE_D,与ClassA对应的表为TABLE_A,在TABLE_D中定义了外键A_ID,它参照TABLE_A表的主键. ClassD对象的a属性既可以引用ClassB对象,也可以引用ClassC对