在进行下面的说明之前,先说一下什么是类型兼容规则:类型的兼容规则是指在需要基类对象的任何地方,都可以用公有派生类的对象来替代。这样公有派生类实际就具备了基类的所有功能,凡是基类能够解决的问题,公有派生类都可以解决,类型兼容规则中所指的替代包括以下的情况:
。派生类的对象可以赋值给基类的对象
。派生类的对象可以初始化基类的引用
。派生类对象的地址可以赋给指向基类的引用
根据类型兼容规则,可以使用派生类的对象代替基类的对象,如果用基类类型的指针指向派生类对象,就可以通过这个指针访问给对象,问题是访问到的只是从基类继承来的同名成员。如果需要通过基类的指针指向派生类的对象,并访问某个同名的成员,那么就要在基类中将这个同名的成员函数说明为虚函数。
# include <iostream.h>
class A
{
public:
virtual void play(){cout<<"A::play()"<<endl;}//使用virtual关键字此函数为虚函数,否则不为虚函数
};
class B:public A
{
void play(){cout<<"B::play()"<<endl;}
};
class C:public B
{
void play(){cout<<"C::play()"<<endl;}
};
void main()
{
A *ap;
B b;
C c;
ap=&b;
ap->play();
ap=&c;
ap->play();
}
program out:
如果类A不定义为虚函数:
A::play()
A::play()
如果类定义为虚函数
B:play()
C:play()
下面说明什么是虚基类,在说明虚基类之前先说明类的同名覆盖原则,同名覆盖原则是指在没有虚函数的情况下,如果某派生类的多个基类拥有同名的成员,同时,派生类又新增这样的同名成员,在这种情况下,派生类成员将隐藏所有基类的同名成员。举例:
#include <iostream.h>
class A
{
public:
void play(){cout<<"A::play()"<<endl;
};
class B:public A
{
public:
void play(){cout<<"B::Play()"<<endl;
};
void main()
{
B b;
b.play(); //派生类对象b的同名成员play()覆盖了基类的play()成员
b.A::paly(); //要想访问基类的成员用b.A::play()
}
那么什么是虚基类呢?
当某个派生类的部分或全部直接基类是从另一个共同的基类派生而来时,在这些直接基类中从上一级共同基类继承来的成员就拥有相同的名称,因此派生类中也就会产生同名现象,在派生类的对象中,这些同名数据成员在内存中同时拥有多个拷贝,同名函数名就有多个映射,对这种类型的同名成员也要使用作用域分辨符来惟一标识,而且用直接基类来限定,但是我们有没有别的办法让派生类中同名成员有一个拷贝呢,回答是,有。我们可以将共同基类设置为虚基类,这时从不同的路径继承下来的同名成员在内存就只有一个拷贝,同一个函数也只有一个映射。
#include <iostream.h>
class A
{
public;
int a;
void play(){cout<<"A::play()"<<endl;}
};
class B1:virtual publc A //关键字virtual的作用是定义类A为虚基类
{
publci:
int b1;
};
class B2:virtual public A //关键字virtual的作用是定义类A为虚基类
{
public:
int b2;
};
class C:publci B1 ,public B2
{
public:
int c;
void play(){cout<<"C::play()"<<endl;}
};
void main()
{
C c;
c.play();
}
program out:
A::paly()
分享到:
相关推荐
"虚函数"和"虚基类"是C++多态性的重要概念,它们使得面向对象编程更加灵活和强大。下面我们将深入探讨这两个主题。 首先,虚函数(Virtual Functions)是C++中实现动态多态的关键。当一个基类指针或引用指向其派生...
c++ 虚基类和虚函数+代码.有一个案例,里面有源代码。看完就懂什么叫c++ 虚基类和虚函数了
虚基类与虚函数 虚基类的概念 在C++语言中,一个类不能被多次说明为一个派生类的直接基类,但可以不止一次地成为间接基类。这就导致了一些问题。为了方便 说明,先介绍多继承的“类格”表示法。
在C++编程语言中,虚基类、虚函数成员和虚析构函数是面向对象编程中的关键概念,它们对于理解和实现多态性至关重要。多态性允许我们编写更灵活、可扩展的代码,使得程序能处理多种不同类型的对象。下面将详细解释这...
在C++编程语言中,虚函数(virtual functions)是实现多态性的一种关键机制,它允许我们通过指针或引用调用子类重写的方法,即使该指针或引用指向的是基类。当我们讨论基类与子类的虚函数调用顺序时,这涉及到构造...
总结来说,虚基类和虚函数是C++中解决多继承问题和实现动态多态的重要工具。虚基类确保了基类在派生层次结构中只有一个实例,避免了二义性;而虚函数则允许子类重写父类的功能,实现了基于对象实际类型而非定义类型...
总之,虚基类、虚函数和纯虚函数是C++中实现面向对象编程的关键特性,它们分别用于解决多重继承的二义性、实现运行时多态以及强制派生类提供特定功能的实现。理解并掌握这些概念对于编写高效、可扩展的C++程序至关...
通常情况下,虚基类的构造函数应该先于非虚基类被调用。 3. **函数重写**:如果决定改写基类所提供的虚拟函数,那么派生类所提供的新定义必须完全符合基类所声明的函数原型,包括参数列表、返回类型以及是否为常量...
虚基类和虚函数是C++面向对象编程中的重要概念,它们主要解决多继承中可能出现的问题,特别是关于共享基类实例和二义性问题。在本篇PPT学习教案中,我们将深入探讨这两个主题。 首先,让我们理解虚基类的概念。在多...
在C++编程中,虚函数(Virtual Function)和虚基类(Virtual Base Class)是实现多态性的重要机制,它们是面向对象编程的关键特性。本文将通过实例详细讲解这两种概念。 首先,我们来看虚函数。虚函数是一种允许...
//析构函数做成员函数 }; Base::~Base()//成员函数实现 { cout; } class Derived:public Base { public: Derived(); ~Derived(); private: int *p; }; Derived::Derived() { p=new int(0);//从堆上分配一个int型...
总结起来,C++的虚函数、虚基类、实例化和运算符重载都是其强大功能的体现,它们在实际编程中有着广泛的应用,帮助开发者编写出高效、可维护的代码。理解并熟练掌握这些概念是成为专业C++程序员的关键步骤。
- 当一个派生类多重继承多个基类时,如果这些基类中有虚函数,那么派生类会有一个虚函数表,其中包含了所有基类的虚函数和派生类自身的虚函数。 - 在示例代码中,`Derived` 类继承了三个类,`Base1` 和 `Base2` 都...
3. **代码可扩展性和安全性**:如果一个类可能作为其他类的基类,则应将其析构函数声明为虚函数。这不仅可以确保代码的安全性,还可以提高代码的可扩展性,允许未来添加更多的派生类而无需修改现有代码。 ### 实例...
1. **VTable合并**:由于`C3`从`C1`和`C2`多重继承而来,它的虚函数表中包含了来自两个基类的所有虚函数地址。 2. **对象创建**:创建`C3 c3;`时,`c3`的虚函数指针指向的是`C3`的虚函数表,但由于多重继承的存在,...
在C++的多继承体系中,派生类能够重写其不同基类中的虚函数,这一特性极大地增强了代码的灵活性和可复用性。...通过恰当的设计和实现,可以在派生类中有效地重写不同基类中的虚函数,从而实现代码的重用和多态性。
3. 测试代码:创建基类和派生类的对象,通过基类指针调用虚函数,验证虚函数表的正确工作,例如: ```cpp int main() { Base* basePtr = new Derived(); basePtr->func1(); // 调用Derived的func1 basePtr->func2...
"多继承和虚基类PPT" 本资源总结了C++中的多继承和虚基类的概念和应用。多继承是指一个派生类可以继承多个基类的成员,包括数据成员和函数成员。虚基类是解决多继承中出现的命名冲突和继承路径复杂性的机制。 多...