#include <iostream>
using namespace std;
class A
{
public:
virtual void F(){
cout<<"A::F()"<<endl;G();
}
void G(){cout<<"A::G()\n";}
void H(){cout<<"A::H()\n";G();}
};
class B :public A
{
public:
virtual void F(){
cout<<"B::F()"<<endl;G();
}
void G(){cout<<"B::G()\n";}
};
class C :public B
{
public:
void G(){cout<<"C::G()\n";}
};
void main()
{
C c;
A *ap = &c;
ap->F(); //因为A中的F被B覆盖了且是virtual类型的,调用的是B的F,因此B中的F调用的是B中的F
//output : B::F() B::G()
B b;
b.H(); //H中调用的函数是H所在类的函数,无论那个函数是否被继承覆盖
//output : A:H() A::G()
}
分享到:
相关推荐
在这个编程题目中,我们主要涉及了C++中的几个核心概念:纯虚函数、动态多态性、父类指针和继承。接下来,我们将详细探讨这些知识点。 1. **纯虚函数**: 纯虚函数是C++中实现抽象类的关键。在类声明中,当一个...
C++类继承内存布局是一种复杂的机制,涉及到类的继承、成员变量的访问、成员函数的访问、虚函数调用、强制转换到基类或虚基类等多个方面。在本文中,我们将从C结构的布局开始,逐步介绍单继承、多重继承、虚继承的...
父类指针指向子类对象 - **子类对象的地址赋值给父类指针**: ```cpp Derived d; Base *b = &d; ``` 这里 `b` 是指向 `Derived` 类型对象 `d` 的 `Base` 类型指针。 - **将子类对象(地址)传递给参数为...
通过指针或引用进行向上转型,我们可以用父类指针或引用来调用子类对象的方法,即使这些方法在父类中没有定义。例如: ```cpp class Base { public: virtual void print() { cout ; } }; class Derived : public ...
在C++编程语言中,类的继承是面向对象编程(OOP)的一个核心概念,它允许我们创建一个新类(子类或派生类),该类不仅拥有已存在的类(父类或基类)的特性,还能添加新的特性和功能。这种机制有助于代码重用,降低...
这样,当我们有一个指向`Shape`指针或引用时,可以调用`Area`方法,实际执行的是子类的特定实现,这就是多态性。 在提供的压缩包“总实验”中,可能包含了多个C++源文件,每个文件代表一个特定的继承和多态的例子。...
2. **内存布局变化**:虚拟继承会改变对象的内存布局,增加了一个指向虚基类的指针(虚表指针,vptr),用于在运行时确定对象的实际类型。 3. **性能影响**:虽然虚拟继承解决了菱形问题,但它的内存开销和构造/析...
虚析构函数的目的是为了确保在删除一个基类指针指向的派生类对象时,能够正确地调用派生类的析构函数,防止内存泄漏。而在C++中,构造函数不能声明为虚函数,因为构造过程必须是确定的,它是在对象创建时执行的,...
在上述例子中,如果不使用虚函数,当使用基类指针指向派生类对象并调用成员函数时,将会调用基类的实现,而不是派生类的重定义。为了实现动态绑定,我们需要在基类中声明一个虚函数,例如: ```cpp class Animal { ...
在C++编程语言中,多继承是一种允许一个子类继承多个父类的特性,这使得子类能够获得多个父类的属性和方法。然而,这种特性可能会引发“菱形问题”(Diamond Problem),即当一个类同时从两个或更多的类继承,而这些...
在C++编程语言中,多重继承是一个特性,允许一个类(子类)继承自多个基类(父类)。这种设计模式使得子类可以同时获得多个基类的特性,增加了代码的复用性。然而,多重继承也带来了一些复杂性和潜在的问题,其中最...
当通过基类指针或引用调用这个函数时,会根据实际指向的对象类型动态地决定调用哪个子类的版本,这就是动态绑定或后期绑定。 **5. 重构(Refactoring)** 重构是对现有代码进行改进的过程,不改变其外部行为,而是...
这样,通过基类指针调用函数时,实际上会根据指针指向的虚函数表来决定调用哪个实际的函数。 ```c typedef void (*VirtualFunc)(void*); typedef struct { VirtualFunc virtualMethod; } Base; typedef struct {...
每个虚继承的子类都会有一个指向虚基表的指针,该表包含了访问虚基类成员的正确路径。这样,无论通过哪个父类访问虚基类的成员,都会找到唯一正确的实例。 然而,虚继承也会带来一些开销,比如增加了内存占用和构造...
当基类指针或引用指向子类对象并调用该函数时,会调用子类的版本,而不是基类的。虚函数表(Vtable)是实现这一机制的内部手段。 “模板”是C++中的另一大特性,它允许我们编写泛型代码,适用于多种数据类型。模板...
同化的概念同样适用于指针,子类对象的指针转换为父类指针后,如果直接调用成员函数,将按照父类的行为执行,而不是子类的行为,这可能导致子类特性的丢失。 3. 虚函数 (Virtual Function) 为了解决上述问题,C++...
在多重继承中,如果使用了虚继承,子类的对象内存布局会包含一个虚基类表指针(vbptr),该指针指向一个虚基类表(vbtable),这个表记录了与虚基类相关的偏移量信息。虚拟菱形继承是多重虚继承中的一种特例,它需要...
在这个特定的问题中,"c++继承类(StudentAndTeacher继承至Person" 提示我们需要讨论如何创建两个新的类——Student和Teacher,它们都继承自一个名为Person的基类。这个设计模式常见于模拟现实世界中的关系,比如在...