c++继承、多态以及与java的行为差异之处
对于面向对象而言,多态是最有用的基本特性之一,相对于函数指针,易用得多。下面看下c++继承和多态行为的基本特性,最后说明下和java的基本差别。
首先定义父类和子类。
base.h
#pragma once class Base { public: int i; Base(void); ~Base(void); virtual void testDynCast(); };
base.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include "stdafx.h" #include "Base.h" #include <iostream> using namespace std; Base::Base( void ) { } Base::~Base( void ) { } void Base::testDynCast() { cout << i << endl; } |
Derived.h
#pragma once #include "base.h" class Derived : public Base { public: void testDynCast(); Derived(void); ~Derived(void); };
Derived.cpp
#include "stdafx.h" #include "Derived.h" #include <iostream> using namespace std; Derived::Derived(void) { } Derived::~Derived(void) { } void Derived::testDynCast() { cout << (i * i) << endl; }
基本使用:
int _tmain(int argc, _TCHAR* argv[]) { //多态测试 Derived derived = Derived(); derived.i = 100; derived.testDynCast(); Base* dp1 = &derived; // 继承测试 if(Derived *dp = dynamic_cast<Derived*>(dp1)) { dp->testDynCast(); } Base base = Derived(); base.i = 100; base.testDynCast(); dp1 = &base; // 继承测试 if(Derived *dp = dynamic_cast<Derived*>(dp1)) { dp->testDynCast(); } cout << "继承测试结束" << endl; // 继承测试结束 }
输出如下:
10000 10000 100 继承测试结束
从上面的代码和结果可以看出,c++跟java的要求或差别至少包括:
1、c++不要求类名和文件名保持一致,不过保持一致总是一个好习惯;
2、对于非抽象类,在定义对象时所使用的c++类型决定了实际类型,至于具体赋值的是什么类型应该是自动截掉了(虽然没有本质性差别,但是对于习惯了java的人员而言,明显多此一举)。
3、为了使用多态,必须至少有一个方法声明为虚函数。
刚想到反射(一般而言,如果要写一个框架比如RPC的话,掌握反射是必不可少的)的问题,总体而言,可以参考下面两个链接:
https://technet.microsoft.com/zh-cn/library/7k3448yy.aspx
http://www.tuicool.com/articles/VJRVVrQ
实现本身而言,应该没有想象那么难。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!