C++父类子类转化及函数调用

     这些天分析OGRE源码,里面有关C++继承及父类子类转化运用,笔记记录如下:

一 子类转化父类

     这里的”转化“不是真正的转化,是一种形式上的转化,主要用于多态,定义父子类函数如下:

#include "stdafx.h"
#include <iostream>
using namespace std;
class Base {
private:
   int number;
public:
	Base(){
		number = 15;
	}
   virtual void test() {
	    std::cout << "Base test\n" << number << std::endl;
    }
	void write() {
		std::cout << "Base  write" << std::endl;
   }
};
class Derived :public Base {
public:
	int addData;
	Derived(){
        addData = 20;
		number = 19;
	}
	void test() {
		std::cout << "Derived test\n" << number<< std::endl;
	}
	void addTest()
	{
		std::cout << "Add test" << std::endl;
	}
	void testData()
	{
		std::cout << "Test Data" << addData<<std::endl;
	}
	void write() {
			std::cout << "Derived  write"<< std::endl;
	}
};
int main()
{
    Derived *derive=new 
C++ 中,父类调用子类的虚函数是多态的核心特性之一,其实现依赖于虚函数表(vtable)和虚函数指针(vptr)机制。当基类中的函数被声明为虚函数时,派生类可以重写该函数,并在运行时根据对象的实际类型动态调用对应的函数实现[^1]。 ### 实现方式 #### 1. 通过基类指针或引用调用派生类的虚函数 当基类中定义了虚函数,派生类重写了该虚函数时,通过基类指针或引用指向派生类对象,即可在运行时调用派生类的实现。 ```cpp #include <iostream> using namespace std; class Base { public: virtual void foo() { cout << "Base::foo()" << endl; } virtual ~Base() {} // 确保析构函数为虚函数,防止内存泄漏 }; class Derived : public Base { public: void foo() override { cout << "Derived::foo()" << endl; } }; int main() { Derived d; Base* basePtr = &d; basePtr->foo(); // 调用 Derived::foo() return 0; } ``` 上述代码中,`basePtr` 是指向 `Base` 类型的指针,但实际指向的是 `Derived` 类型的对象。由于 `foo()` 是虚函数,程序在运行时会根据对象的实际类型调用 `Derived::foo()`[^4]。 #### 2. 确保析构函数为虚函数 若基类的析构函数不是虚函数,则在通过基类指针删除派生类对象时,不会调用派生类的析构函数,可能导致资源泄漏。因此,若类设计用于继承,应将析构函数声明为虚函数[^2]。 ```cpp class Base { public: virtual ~Base() {} // 声明为虚析构函数 }; class Derived : public Base { public: ~Derived() { // 清理资源 } }; ``` #### 3. 使用纯虚函数实现接口抽象 若基类不提供具体实现,仅定义接口供派生类实现,则可将函数声明为纯虚函数。此时基类为抽象类,不能直接实例化对象,只能通过派生类实现多态调用[^3]。 ```cpp class Animal { public: virtual void speak() = 0; // 纯虚函数 }; class Dog : public Animal { public: void speak() override { cout << "Woof!" << endl; } }; ``` ### 总结 - 基类调用派生类虚函数的关键在于虚函数机制。 - 基类指针或引用指向派生类对象时,调用虚函数将触发派生类的实现。 - 确保基类析构函数为虚函数,以避免资源泄漏。 - 使用纯虚函数定义接口并实现抽象类,强制派生类实现相应功能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值