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

是否可以在不重写的情况下在派生类中记录虚拟成员?

在派生类中记录虚拟成员的情况下,可以通过调用基类的虚拟成员来实现。派生类可以继承基类的虚拟成员,并在派生类中调用基类的虚拟成员来记录相关信息,而无需重写虚拟成员。

虚拟成员是在基类中声明并使用关键字"virtual"修饰的成员函数或属性。派生类可以通过继承基类的虚拟成员来直接使用,并且可以在派生类中调用基类的虚拟成员。

例如,假设有一个基类Animal和一个派生类Dog,Animal类中有一个虚拟成员函数makeSound(),派生类Dog可以通过继承Animal类来使用makeSound()函数,并在派生类中记录相关信息。

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

class Animal {
public:
    virtual void makeSound() {
        std::cout << "Animal makes a sound." << std::endl;
    }
};

class Dog : public Animal {
public:
    void makeSound() override {
        Animal::makeSound(); // 调用基类的虚拟成员函数
        std::cout << "Dog barks." << std::endl;
        // 在派生类中记录相关信息
    }
};

int main() {
    Animal* animal = new Dog();
    animal->makeSound(); // 调用派生类中的虚拟成员函数
    delete animal;
    return 0;
}

在上述示例中,派生类Dog重写了基类Animal的虚拟成员函数makeSound(),并在派生类中调用了基类的makeSound()函数。这样就可以在派生类中记录相关信息,而无需重写虚拟成员。

需要注意的是,虚拟成员函数需要使用关键字"virtual"进行声明,并且在派生类中使用关键字"override"进行标识,以确保正确调用派生类中的虚拟成员函数。

腾讯云相关产品和产品介绍链接地址:

请注意,以上仅为腾讯云的部分产品示例,更多产品和详细信息请参考腾讯云官方网站。

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

相关·内容

可以source脚本情况下将变量从Bash脚本导出到环境

echo $VAR 有没有一种方法可以通过只执行 export.bash 而 source 它获取 $VAR? 答: 不可以。 但是有几种可能解决办法。...调用 shell 上下文中执行脚本: $ cat set-vars1.sh export FOO=BAR $ . set-vars1.sh $ echo $FOO BAR 另一种方法是脚本打印设置环境变量命令.../set-vars2.sh)" $ echo "$FOO" BAR 终端上执行 help export 可以查看 Bash 内置命令 export 帮助文档: # help export export...-f 指 shell 函数 -n 从每个(变量)名称删除 export 属性 -p 显示所有导出变量和函数列表 ---- 参考: stackoverflow question 16618071...help eval 相关阅读: 用和不用export定义变量区别 shell编程$(cmd) 和 `cmd` 之间有什么区别 ----

15020

abstract virtaul override new 及多态

派生类,通过包括使用 override 修饰符属性声明,可以重写抽象继承属性。...将调用大部分派生类重写成员,如果没有派生类重写成员,则它可能是原始成员。 默认情况下,方法是非虚拟。不能重写非虚方法。...通过包括使用 override 修饰符属性声明,可在派生类重写虚拟继承属性。 派生类 C# 派生类可以包含与基类方法同名方法。 基类方法必须定义为 virtual。...阻止派生类重写虚拟成员 无论虚拟成员和最初声明虚拟成员类之间已声明了多少个类,虚拟成员永远都是虚拟。...如果类 A 声明了一个虚拟成员,类 B 从 A 派生,类 C 从类 B 派生,则类 C 继承该虚拟成员,并且可以选择重写它,而不管类 B 是否为该成员声明了重写

75430

【C++】三大特性之多态

那么继承要 构成多态还有两个条件: 必须通过基类指针或者引用调用虚函数 被调用函数必须是虚函数,且派生类必须对基类虚函数进行重写 2.虚函数 我们讲继承菱形继承时候曾经说到过虚拟继承...,派生类虚函数不加  virtual 关键字时,虽然也可以构成重写 ( 因为继承后基类虚函数被继承下来了派生类依旧保持虚函数属性), 但是该种写法不是很规范,建议这样使用 虚函数重写两个例外...虚函数表本质是一个存虚函数指针指针数组,一般情况这个数组最后面放了一个 nullptr 。(VS情况) 5....总结一下派生类虚表生成: a.先将基类虚表内容拷贝一份到派生类虚表 b.如果派生类重写了基类某个虚函数,用派生类自己虚函数覆盖虚表基类虚函数 c.派生类自己新增加虚函数按其派生类声明次序增加到派生类虚表最后...菱形继承、菱形虚拟继承 实际我们建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样 模型,访问基类成员有一定得性能损耗。

72650

C++进阶-多态

virtual 重写基类虚函数时,派生类虚函数不加virtual关键字也可以构成重写 原因: 继承后基类虚函数被继承下来了派生类依旧保持虚函数属性) 示例: class Person...如果基类虚函数不加virtual,派生类虚函数加virtual,这种情况构成虚函数 析构函数重写 我们知道,基类指针和引用可以指向基类和派生对象,由此通过指针和引用释放对象时需要实现析构多态...(虚表指针也就),存在部分另一部分是自己成员 对于派生类d对象,因为Func1完成了重写,所以d虚表重写Derive::Func1(将继承虚函数进行重写,而对应虚函数表上进行覆盖成自己虚函数地址也叫作覆盖...一般情况这个数组最后面放了一个nullptr(用来表示结束)(可能根据编译器而定) 派生类虚表生成总结: 先将基类虚表内容拷贝一份到派生类虚表 如果派生类重写了基类某个虚函数,...这里覆盖地址进行了一次包装,每个地址都指向一个jump,而两个jump存是同一个虚函数地址 对于菱形继承/菱形虚拟继承: 实际建议设计出菱形继承及菱形虚拟继承:一方面太复杂容易出问题,另一方面这样模型

57930

【C++修炼之路】15.C++继承

基类private成员派生类是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类能访问,就定义为protected。可以看出保护成员限定符是因继承才出现。...而现在我们学习了继承,知道基类可以传给派生类成员变量以及成员函数,但这默认成员函数对于每一个类来说都必须是自己,并且基类成员变量有可能比派生类成员变量数量匹配,种种情况都表明,派生类默认成员函数不能使用基类默认成员函数...写自动生成又是否可以呢?我将基类放在开头,下面的代码都是此基类派生类。...如果写拷贝构造,完全可以解决基类继承下来和内置类型,因为属于基类类型会自动调用基类拷贝构造,上面的结果也可以证实这一点,而内置变量拷贝构造会随着初始化列表进行值拷贝,因此写拷贝构造结果与类和对象情况是一样...4.3 派生类赋值运算符重载 写这个函数调用默认赋值运算符重载,情况和拷贝构造一样,成员变量含自定义变量则不能处理。

52500

【c++】多态&&虚函数&&抽象类&&继承虚函数表详解

那么继承要构成多态还有两个条件: 必须通过基类指针或者引用调用虚函数 被调用函数必须是虚函数,且派生类必须对基类虚函数进行重写 2.2 虚函数 虚函数:即被virtual修饰成员函数称为虚函数...,派生类虚函数不加virtual关键字时,虽然也可以构成重写(因 为继承后基类虚函数被继承下来了派生类依旧保持虚函数属性),但是该种写法不是很规范,建议 这样使用*/ /*void BuyTicket...d也有一个虚表指针,d对象由两部分构成,一部分是父类继承下来成员,虚表指针也就是存在部分另一部分是自己成员 基类b对象和派生类d对象虚表是不一样,这里我们发现Func1完成了重写,所以d虚表重写...nullptr 总结一下派生类虚表生成:a.先将基类虚表内容拷贝一份到派生类虚表 b.如果派生类重写了基类某个虚函数,用派生类自己虚函数覆盖虚表基类虚函数 c.派生类自己新增加虚函数按其派生类声明次序增加到派生类虚表最后...:多继承派生类重写虚函数放在第一个继承基类部分虚函数表 5.3 菱形继承、菱形虚拟继承 实际我们建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样模型,访问基类成员有一定得性能损耗

32510

C#Abstract 、Virtual和Override使用

标记为抽象或包含在抽象类成员必须通过从抽象类派生类来实现。 (1)抽象类具有以下特性: 1) 抽象类不能实例化。 2) 抽象类可以包含抽象方法和抽象访问器。...除了声明和调用语法上不同外,抽象属性行为与抽象方法一样。静态属性上使用abstract修饰符是错误派生类,通过包括使用 override 修饰符属性声明,可以重写抽象继承属性。...虚拟成员实现可由派生类重写成员更改。调用虚方法时,将为重写成员检查该对象运行时类型。将调用大部分派生类重写成员,如果没有派生类重写成员,则它可能是原始成员。默认情况下,方法是非虚拟。...4. base和this区别 1)base作用:用于从派生类访问基类成员,调用基类上已被其他方法重写方法。指定创建派生类实例时应调用基类构造函数。...注:从静态方法中使用 base 关键字是错误。 2)区别: base 是子类引用父类,用于派生类访问重写基类成员

1.2K20

【C++】从零开始认识多态

应该释放空间全都释放了!!! 所以建议析构函数设置为虚函数,避免出现上述情况。 3.3 语法细节 派生类(基类必须写)对应函数可以写virtual(这个语法点非常奇怪!...首先: A类与B类构成继承关系 func函数是虚函数(B类是派生类可以写virtual),并且AB 满足三同。构成多态。...,只有程序运行时没有得到预期结果才来debug会得不偿失,因此:C++11提供了override和final两个关键字,可以帮助用户检测是否重写。...: 抽象类间接强制了派生类必须进行虚函数重写 override是已经重写情况下,帮助进行重写语法检查 6 多继承多态 多继承我们讲过,是一种很危险继承,很容易导致菱形继承,引起数据冗余和二义性...菱形继承和菱形虚拟继承 实际我们建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样模型,访问基类成员有一定得性能损耗。

7710

【多态】【虚表指针与虚表】【多继承多态】

派生类重写虚函数可以不加 virtual(建议最好加上) 这里去掉子类重写虚函数 virtual 是可以,但是注意不能去掉基类虚函数 virtual,因为它认为派生类是先继承父类虚函数...解答: 哎呀,知识不能乱了,还记得吗,类普通成员函数是包含在类,它是存在于公共代码段,只是我们这里有了虚函数之后,为了实现多态行为,必须得有虚函数表,所以才将虚函数表指针算入了成员变量!...总结一下派生类虚表生成: 先将基类虚表内容拷贝一份到派生类虚表 如果派生类重写了基类某个虚函数,用派生类自己虚函数覆盖虚表基类虚函数 派生类自己新增加虚函数按其派生类声明次序增加到派生类虚表最后...由此可以看出,派生类成员函数被放到了第一个父类,(所谓第一个父类是按照声明顺序来判断)!然后其他规则是和单继承一样!...3.菱形继承、菱形虚拟继承 实际我们建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样模型,访问基类成员有一定得性能损耗。

1.1K30

深度剖析C++多态

派生类虚函数不加virtual关键字时,虽然也可以构成重写(因 为继承后基类虚函数被继承下来了派生类依旧保持虚函数属性),但是该种写法不是很规范,建议 这样使用*/ }; 诶!...2.4override和final C++11,引入了override和final (1)override:放在派生类虚函数后面,检测该虚函数是否重写了基类虚函数,如果没有就报错 class Car...人狠话不多,直接上调试: 我们可以看见除了成员_b以外,还有一个指针_vfptr,这个指针就是我们主角引路人-》虚函数表指针,它指向一个虚函数表。...咱们再来看一下在继承虚函数表是什么样: class Base { public: virtual void Func1() { cout << "Base::Func1()" << endl...可以看见dd和bb虚表是不一样,因为派生类对象dd对基类对象bb重写了Func1(),所以dd虚表里面变成了Drive::Func1()。所以虚函数重写也叫做覆盖,即虚函数覆盖。

8310

承上启下角色——继承

基类private成员派生类无论以什么方式继承都是不可见。这里不可见是指基类私 有成员还是被继承到了派生类对象,但是语法上限制派生类对象不管类里面还是类外面都不能去访问它。 2....基类private成员派生类是不能被访问,如果基类成员不想在类外直接被访问,但需要在 派生类能访问,就定义为protected。可以看出保护成员限定符是因继承才出现。 3....继承体系基类和派生类都有独立作用域。 2. 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员直接访问,这种情况叫隐藏,也叫重定义。...6个默认成员函数,“默认”意思就是指我们写,编译器会变我们自动生成一个,那么派生类 ,这几个成员函数是如何生成呢?...派生类对象析构清理先调用派生类析构再调基类析构。 7. 因为后续一些场景析构函数需要构成重写(多态一种父子成员函数关系),重写条件之一是函数名相同(重写条件之一为隐藏条件)。

73330

【C++高阶】C++继承学习手册:全面解析继承各个方面

return 0; } 继承定义 我们从刚刚代码示例可以看到A是基类(父类),B是派生类(子类) 定义格式 注意:定义继承时候继承方式可以省略写,如果写则是根据基类定义来决定默认继承方式...继承作用域 关于作用域注意事项: 继承体系基类和派生类都有独立作用域。 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员直接访问,这种情况叫隐藏,也叫重定义。...D对象_a成员会有两份,我们访问时候无法明确知道访问是哪一个,必须要显示指定访问哪个父类成员,但是数据冗余任然无法解决! 虚拟继承 虚拟继承可以解决菱形继承二义性和数据冗余问题。...具体来说,虚拟继承会在内存创建一个虚基表,并在派生类对象存储一个指向这个虚基表指针(即虚基表指针)。虚基表偏移量。通过偏移量可以找到下面的A,而无需派生类对象多次存储这些数据成员。...因此,虚拟继承通过减少重复存储数据成员来消除数据冗余 虚拟继承通过改变派生类访问虚基类成员方式来解决这个问题。虚拟继承派生类对象通过虚基表指针来访问虚基类(即共同祖先类)成员

14310

【C++】继承

基类 private 成员派生类无论以什么方式继承都是不可见。...基类 private 成员派生类是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类能访问,就定义为protected 。 可以看出保护成员限定符是因继承才出现 。 3....(注:c++标准没有明确规范派生类对象在内存如何分配,但是我们可以认为是如图分配一个对象,继承自基类部分和派生类自定义部分不一定是连续存储)。...继承体系基类和派生类都有独立作用域。 2. 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员直接访问,这种情况叫隐藏,也叫重定义。...五、派生类默认成员函数  6个默认成员函数,“默认”意思就是指我们写,编译器会变我们自动生成一个,那么派生类,这几个成员函数是如何生成呢? 1.

9210

【C++】多态——实现、重写、抽象类、多态原理

继续往下看把 而通过指针是符合多态条件: 注意: 1.子类虚函数可以不加virtual 重写基类虚函数时,派生类虚函数不加virtual关键字时,虽然也可以构成重写(因为继承后基类虚函数被继承下来了派生类依旧保持虚函数属性...),但是该种写法不是很规范,建议这样使用: 2.协变(基类与派生类虚函数返回值类型不同) 在三同,返回值可以换不同,但是要求返回值必须是一个父子类关系指针或者引用 ---- 三、析构函数重写...总结一下派生类虚表生成:先将基类虚表内容拷贝一份到派生类虚表,如果派生类重写了基类某个虚函数,用派生类自己虚函数覆盖虚表基类虚函数,派生类自己新增加虚函数按其派生类声明次序增加到派生类虚表最后...3.菱形继承、菱形虚拟继承 实际我们建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样模型,访问基类成员有一定得性能损耗。...虚函数表是在编译阶段就生成构造函数初始化列表初始化虚表指针,一般情况下存在代码段(常量区)。 6.不要把虚函数表和虚基表搞混了:多态,虚函数表是存放虚函数地址。

40830

【C++】三大特性之继承

这里不可见是指基类私有成员还是被继承到了派生类对象,但是语法上限制派生类对象不管类里面还是类外面 都不能去访问它。...基类private成员派生类是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类能访问,就定义为protected。可以看出保护成员限定符是因继承才出现。...(子类成员函数可以使用 基类::基类成员 显示访问) 需要注意是如果是成员函数隐藏,只需要函数名相同就构成隐藏。 注意在实际继承体系里面最好不要定义同名成员。...菱形继承问题: 从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性问题。 Assistant 对象 Person 成员会有两份。..._d = 5; return 0; } 我们可以将内存分为下图: 当我们使用虚拟继承时候:   我们发现A成员被放到了最后面,原有的B和C类中放继承A成员数据地方变成了一串地址,指向地址第二行记录了距离

34520

【c++】全面理解C++多态:虚函数表深度剖析与实践应用

delete 操作时,能够按照正确顺序调用派生类和基类析构函数 派生类可以写virtual class Person { public: virtual void BuyTicket() {...,派生类虚函数不加virtual关键字时,虽然也可以构成重写(因为继承后基类虚函数被继承下来了派生类依旧保持虚函数属性),但是该种写法不是很规范,建议这样使用 1.3 C++11 override...// 显式调用Base类中被隐藏func(int) obj.func(3.14); // 调用Derived类func(double) 两个基类和派生类同名函数,构成重写就是隐藏 2.多态原理...多继承和虚继承情况下,这个顺序变得更加复杂。...然而,虚继承情况下,共享基类(该例子是 A)只会被初始化一次,而且是由最底层派生类(D)来初始化。

20100

C++继承

基类private成员派生类是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类能访问,就定义为protected。可以看出保护成员限定符是因继承才出现。...pp; // 这种情况转换时可以。...(子类成员函数可以使用 基类::基类成员 显示访问) 需要注意是如果是成员函数隐藏,只需要函数名相同就构成隐藏。 注意在实际继承体系里面最好不要定义同名成员。...6个默认成员函数,“默认”意思就是指我们写,编译器会变我们自动生成一个,那么派生类,这几个成员函数是如何生成呢?..._name = "peter"; } 虚拟继承原理 其实这个原理讲解很复杂,博主知识讲解能力有限,所以只给出结论: 它在继承之后并不会创造出两个基类成员来给派生类继承,而是派生类记录两个偏移量

8310

【C++】万字一文全解【继承】及其特性__(20)

可以看出保护成员限定符是因继承才出现。 3)派生类不可见 基类private成员派生类无论以什么方式继承都是 不可见 。...基类保护成员 派生类仍然是保护成员,也无法通过派生类对象来直接访问。...(子类成员函数可以使用 基类::基类成员 显示访问) 需要注意是如果是 成员函数 隐藏,只需要函数名相同就构成隐藏。 注意在实际继承体系里面最好不要定义同名成员。...五.派生类默认成员函数生成机制 6个默认成员函数,“默认”意思就是指我们写,编译器会变我们自动生成一个,那么派生类 ,这几个成员函数是如何生成呢?...派生类对象析构清理先调用派生类析构再调 基类 析构。 因为后续一些场景析构函数需要构成重写重写条件之一是函数名相同(多态条件)。

13010

【C++】继承(定义、菱形继承、虚拟继承)

继承,一般用公有和保护,少用私有。 总结: 基类private成员派生类无论以什么方式继承都是不可见。...基类private成员派生类是不能被访问,如果基类成员不想在类外直接被访问,但需要在 派生类能访问,就定义为protected。可以看出保护成员限定符是因继承才出现。...(子类成员函数可以使用 基类::基类成员 显示访问) 需要注意是如果是成员函数隐藏,只需要函数名相同就构成隐藏。 注意在实际继承体系里面最好不要定义同名成员。...派生类对象析构清理先调用派生类析构再调基类析构。 因为后续一些场景析构函数需要构成重写重写条件之一是函数名相同(这个我们后面会讲 解)。...虚拟继承可以解决菱形继承二义性和数据冗余问题。如上面的继承关系,Student和 Teacher继承Person时使用虚拟继承,即可解决问题。

10710

【C++修炼之路】16.C++多态

那虚函数重写与继承隐藏有什么关系? 回忆一下隐藏(重定义):基类与派生类成员函数名字相同,则基类成员函数被派生类隐藏。...3.3 场景问题1 顾名思义,我们已经知道重写是将基类接口拿来,然后将派生类内容覆盖,也就是说函数名是属于基类(这也说明了派生类可以写virtual原因),那参数需不需要重写?...通过观察和测试,我们发现了以下几点问题: 派生类对象d也有一个虚表指针,d对象由两部分构成,一部分是父类继承下来成员,虚表指针就是存在这个部分另一部分,经过重写会变成派生类成员。...总结一下派生类虚表生成:a.先将基类虚表内容拷贝一份到派生类虚表 b.如果派生类重写了基类某个虚函数,用派生类自己虚函数覆盖虚表基类虚函数 c.派生类自己新增加虚函数按其派生类声明次序增加到派生类虚表最后...虚基表示为了构造偏移量,菱形虚拟继承防止二义性。

47500
领券