首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++可以初始化基类的基类吗?

C++中,是无法直接初始化基类的基类的。在C++中,派生类只能直接初始化其直接基类,而不能初始化基类的基类。

当一个派生类对象被创建时,它的直接基类会被自动初始化。这个初始化过程会调用基类的构造函数来完成。但是,派生类对象无法直接访问基类的基类,因此无法直接初始化基类的基类。

然而,通过派生类的构造函数,可以间接地初始化基类的基类。在派生类的构造函数中,可以调用基类的构造函数来初始化基类的成员变量,而基类的构造函数会进一步调用基类的基类的构造函数,以此类推,最终完成基类的基类的初始化。

以下是一个示例代码,展示了如何通过派生类的构造函数间接地初始化基类的基类:

代码语言:txt
复制
#include <iostream>

class BaseBase {
public:
    BaseBase() {
        std::cout << "BaseBase constructor" << std::endl;
    }
};

class Base : public BaseBase {
public:
    Base() {
        std::cout << "Base constructor" << std::endl;
    }
};

class Derived : public Base {
public:
    Derived() {
        std::cout << "Derived constructor" << std::endl;
    }
};

int main() {
    Derived d;
    return 0;
}

输出结果为:

代码语言:txt
复制
BaseBase constructor
Base constructor
Derived constructor

在这个示例中,Derived类继承自Base类,而Base类又继承自BaseBase类。当Derived对象被创建时,会先调用BaseBase的构造函数,然后调用Base的构造函数,最后调用Derived的构造函数。

需要注意的是,派生类的构造函数中,只能通过直接基类的构造函数来间接初始化基类的基类,无法直接调用基类的基类的构造函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++

如果一个派生有多个直接,而这些直接又有一个共同,则在最终派生中会保留该间接共同数据成员多份同名成员。C++提供虚方法,使得在继承间接共同时只保留一份成员。...现在,将A声明为虚,方法如下: class A//声明基A {…}; class B :virtual public A//声明B是A公用派生,A是B {…}; class...C :virtual public A//声明C是A公用派生,A是C {…}; 注意: 虚并不是在声明基时声明,而是在声明派生时,指定继承方式时声明。...因为一个可以在生成一个派生时作为虚,而在生成另一个派生时不作为虚。...可以看到A构造函数被调用了两遍!下面我们把A改成虚再看看结果。

1.1K20
  • C++中虚

    ---- 摘自《C++程序设计》 如果一个派生有多个直接,而这些直接又有一个共同,则在最终派生中会保留该间接共同数据成员多份同名成员。...C++提供虚(virtual base class)方法,使得在继承间接共同时只保留一份成员。 ---- 下面举例说明: 在如下图中: ?...即Student::age,Teacher::age,Student::gender,Teacher::gender,Student::name,Teacher::name,如果不使用虚,我们可以在...但是显示,这我不是我们希望,同样副本我们只需要一份。所以C++中提出了虚实现方式。...声明虚一般形式是: class 派生名:virtual 继承方式 名称 下面是上面实例代码: 声明person.h: #pragma once #include

    64010

    C++私有成员会被继承

    1.派生间接访问私有成员 在继承中,私有成员在派生中是“不可见“,这种”不可见“是指在派生成员函数中,或者通过派生对象(指针,引用)不能直接访问它们。...在派生还是能够通过调用共有函数方式来间接地访问私有成员,包括私有成员变量和私有成员函数。考察如下程序。...()就可以简介访问A中私有成员。...2.私有成员会被继承 如果中并没有提供访问私有成员公有函数,那么其私有成员是否“存在“呢?还会不会被继承呢?...综上所述,私有成员一定存在,也一定被继承到派生中,从大小也可以看出派生包含了私有成员,读者可自行考证。只不过收到C++语法限制,在派生中访问私有成员只能通过间接方式进行。

    2.4K41

    View

    本节将分析 base.py 中最重要一个,它也是所有视图 View 。 之前我们说过,尽管视图看上去种类繁多,但每个都是各司其职,且从命名就可以很容易地看出这个功能。...View Django 视图核心就是这个,这个是所有其它视图,它定义所有视图共有的初始化逻辑,以及一些共有的方法,以便其它视图继承。...初始化 __init__ 方法非常简单,就是将所有传入关键字参数 kwargs 通过 setattr(self, key, value) 设置为实例属性。...这种设计思想就是把视图函数逻辑定义到方法里面去,然后在函数中实例化这个,通过调用方法实现函数逻辑,而把逻辑定义在一个好处就是可以通过继承复用这些方法。... View 定义了所有视图基本逻辑框架,接下来我们会继续分析一系列基于这个 View 定义更加具体通用视图。 如果遇到问题,请通过下面的方式寻求帮助。 在下方评论区留言。

    90450

    c++继承 派生 虚函数

    参考链接: C++继承 继承    关系有组合、继承和代理。继承本质就是代码复用。子类继承父一些东西,父也称为,子类也称为派生。派生继承了除构造函数以外所有成员。 ...中不同访问限定符下(public、protected、private)成员以不同继承方式继承,在派生访问限定也不同,具体如下:  布局优先于派生  #include<iostream...    std::cout << typeid(*pb).name() << std::endl;     pb->Show();     return 0; }  运行结果如下:    上面结果说明一个指针是可以指向其派生对象...此时和派生布局如下:     vfptr指针大小为4(32位机器)。因此字节数为8,派生为12。...typeid()可以动态获取类型。   main函数中,生成了一个派生对象。

    1.1K20

    C++私有成员会被继承

    1.派生间接访问私有成员 在继承中,私有成员在派生中是“不可见“,这种”不可见“是指在派生成员函数中,或者通过派生对象(指针,引用)不能直接访问它们。...在派生还是能够通过调用共有函数方式来间接地访问私有成员,包括私有成员变量和私有成员函数。考察如下程序。...()就可以简介访问A中私有成员。...2.私有成员会被继承 如果中并没有提供访问私有成员公有函数,那么其私有成员是否“存在“呢?还会不会被继承呢?...综上所述,私有成员一定存在,也一定被继承到派生中,从大小也可以看出派生包含了私有成员,读者可自行考证。只不过收到C++语法限制,在派生中访问私有成员只能通过间接方式进行。

    2.4K20

    和派生

    1.什么是?   在面向对象设计中,被定义为包含所有实体共性class类型,被称为“”。-百度百科   简单理解,即父(相对派生) 2.什么是派生?   ...利用继承机制,新可以从已有的中派生。那些用于派生称为这些特别派生出”。   简单理解,即子类(相对) 3.两者关联   和派生是一个相对关系。...和派生反映了继承关系,是相对而言又称父,是被派生继承。派生又称子类,是从一个已有基础上创建,新包含所有成员,并且还添加了自己成员。...4.实际例子   假设有两个A和B,A和B都需要实现一个打印功能,原始做法是A写一个打印函数,B也写一个打印函数。两个还好可以写,但多了就特别麻烦。...这个时候我们就可以写一个C,C里面写一个打印函数。A和B分别继承C,这样A和B就不要写打印函数了。这样即节省了代码,又优化了结构。 上面的情况,C是A和B,A和B是C派生

    95440

    python抽象

    与jvm上语言不一样,python语言没有interface关键字,而且除了抽象,每个都有相应接口:实现或继承公开属性(方法或数据类型) 在定义里,受保护属性和私有属性不在接口中:即便...我们可以在test1已经实例化后,再设置__setitem__,在运行时修改和模块,而不改动源码,这就是所谓“猴子补丁”。...“鸭子类型”:忽略对象真正类型,转而关注对象有没有实现所需方法,签名和语义。 继承抽象很简单,只要实现python里特殊方法__len__之类,这样python就会自动识别。...抽象继承大多都是在collections模块,现在打开这个模块文档看看。...,一共有16个,分为三层: --顶层是Iterable,Container,Sized,Callable,Hashable: 其中Iterable,Container,Sized是各个集合该继承三个抽象

    89110

    C++数组不可以使用多态原因

    原因: 数组分配是采用:首地址+偏移量方式,而偏移量是固定大小,例如:Node arry[10]; arry[i] 地址:&arry[0]+i*sizeof(Node); 当Node是含有虚函数时候...,arry[]中保存都是Node元素,因为数组取值方式便是固定偏移量,一旦数组中存储是继承的话,那么这个数组取值方式,会导致出现不可见错误。...i = 0; i f()Derive f() . // b[1]->f() 输出结果分析: 1.通过上面的输出,可以看出一旦数组是,就算数组中元素赋值为继承,也是被当作来使用...2.非要在数组中使用多态的话,可以采用指针方式,指针偏移量是固定可以使继承多态得到实现。

    82210

    C++虚拟继承与虚

    1.多重继承带来问题 C++虚拟继承一般发生在多重继承情况下。C++允许一个有多个父,这样就形成多重继承。...通过观察这几个大小,可以发现如下等式。...(1)当在多条继承路径上有一个公共,在这些路径中某几条汇合处,这个公共就会产生多个实例(或多个副本),若只想保存这个一个实例,可以将这个公共说明为虚,就像Student和Employee...(4)虚拟继承中,虚对象是由最远派生构造函数通过调用虚构造函数进行初始化,派生构造函数成员初始化列表中必须列出对虚构造函数调用;如果未列出,则表示使用该虚缺省构造函数。...因为虚拟继承只是表名某个对象在派生对象中只被构造一次,而在本例中Student和Employee对象在EGStudent对象中本来就不会被构造多次,所以不将它们申明虚也是完全可以

    90220

    C++中派生成员访问形式

    C++中派生成员访问形式主要有以下两种: 1、内部访问:由派生中新增成员对继承来成员访问。 2、对象访问:在派生外部,通过派生对象对从继承来成员访问。...1、私有继承访问规则 当继承方式为私有继承时,public成员和protected成员被继承后成为派生private成员,派生其它成员可以直接访问它们,但是在外部通过派生对象无法访问...private成员在私有派生中是不可直接访问,所以无论是派生成员还是通过派生对象,都无法直接访问从继承来private成员,但是可以通过提供public成员函数间接访问。...当继承方式为公有继承时,public成员和protected成员被继承到派生中仍作为派生public成员和protected成员,派生其它成员可以直接访问它们。...private成员在私有派生中是不可直接访问,所以无论是派生成员还是派生对象,都无法直接访问从继承来private成员,但是可以通过提供public成员函数直接访问它们。

    2.4K70

    C++:43---派生转换、静态动态变量

    但是继承关系中类比较例外,其规则如下: ①我们可以指针或引用绑定到派生对象上 #include class A {};class B:public A{};int main...二、转换本质 派生可以转换为本质是: ①为什么派生可以转换为:派生而来,因此派生中包含了方法和成员。...此时可以通过指针或引用指向派生(相当于将派生中继承那部分方法和成员绑定到上了,相当于派生被截断了),然后可以将派生假装是一个对象来使用(调用其中成员/方法) ②为什么不能转换为派生...,错误 五、静态类型/动态类型 在上面我们介绍过,指针或引用可以指向于对象也可以指向于派生对象,因此一个可以分为是动态类型还是静态类型: 静态类型变量:在编译时就已经知道是什么类型了...//错误,num属于B,而A内不含有此成员 return 0; } 七、其他情境下类型转换 当我们用一个派生对象为一个对象初始化或赋值时,只有该派生对象中部分会被拷贝、移动或赋值

    1.7K10

    c++-与派生

    浏览量 1 友元函数必须在中进行声明而在外定义,声明时须在函数返回类型前面加上关键字friend。友元函数虽不是成员函数,但它可以访问私有和保护类型数据成员。...函数重载是指C++允许多个同名函数存在,但同名各个函数形参必须有区别:形参个数不同,或者形参个数相同,但参数类型有所不同。...隐藏是指派生函数屏蔽了与其同名函数,规则如下: 如果派生函数与函数同名,但是参数不同。此时,不论有无virtual关键字,函数将被隐藏(注意别与重载混淆)。...2) 如果派生函数与函数同名,并且参数也相同,但是函数没有virtual关键字。此时,函数被隐藏(注意别与覆盖混淆)。...这里当然是在B可以找到A::show() ,因为中指出了这个函数是virtual函数. */ virtual void show() { A::show(); } void rose

    38820
    领券