当前位置: 首页 > news >正文

如何让客户做网站简单个人网站制作流程

如何让客户做网站,简单个人网站制作流程,上海开发app公司,移动端网站构成要素访问继承成员一、访问从基类继承的成员1.1 继承的基本概念1.2 如何访问继承的成员二、为什么要用指针去访问成员2.1 指针的基本用途2.2 多态性的实现2.3 使用指针的其它优势三、总结底层了解背景知识:什么是 vtable 和 vptr?代码示例:虚函数、…

访问继承成员

  • 一、访问从基类继承的成员
    • 1.1 继承的基本概念
    • 1.2 如何访问继承的成员
  • 二、为什么要用指针去访问成员
    • 2.1 指针的基本用途
    • 2.2 多态性的实现
    • 2.3 使用指针的其它优势
  • 三、总结
  • 底层了解
    • 背景知识:什么是 vtable 和 vptr?
    • 代码示例:虚函数、多态、vtable
    • 三、底层原理剖析
      • 3.1 编译器的处理方式(伪代码/概念图)
    • 四、对象切片问题
    • 五、vtable 可视化演示(示意图)
    • 六、验证 vtable 的存在(高级)
    • 七、总结:指针 + 虚函数的意义

一、访问从基类继承的成员

1.1 继承的基本概念

当一个类(子类 / 派生类)从另一个类(父类 / 基类)继承时,它可以获取基类的成员变量和成员函数。继承方式分为三种:

class Base {
public:int a;
protected:int b;
private:int c;
};class Derived : public Base {// public继承方式下,a是public,b是protected,c不可访问
};
继承方式基类 public 成员在派生类中基类 protected 成员在派生类中基类 private 成员在派生类中
public仍是 public仍是 protected不可访问
protected变成 protected变成 protected不可访问
private不可访问不可访问不可访问

1.2 如何访问继承的成员

  • 在子类内部,可以直接访问可见的基类成员;

  • 在子类对象中,也可以通过对象或指针访问。

class Base {
public:int x = 5;void show() { std::cout << "Base::show()" << std::endl; }
};class Derived : public Base {
public:void print() {std::cout << "x = " << x << std::endl;  // 直接访问show();  // 调用基类函数}
};int main() {Derived d;d.print();    // 间接访问 Base 成员d.show();     // 直接访问 Base 的函数std::cout << d.x << std::endl;  // 访问 Base 的变量
}

二、为什么要用指针去访问成员

使用指针(特别是基类指针指向派生类对象)是 C++ 多态性的核心。

2.1 指针的基本用途

  • 可以延迟绑定(多态):运行时决定调用哪个函数。

  • 可以动态分配和释放内存。

  • 可以通过统一接口操作不同对象。

2.2 多态性的实现

使用指针的主要好处体现在虚函数的多态调用中:

class Base {
public:virtual void show() { std::cout << "Base" << std::endl; }
};class Derived : public Base {
public:void show() override { std::cout << "Derived" << std::endl; }
};int main() {Base* ptr = new Derived();  // 基类指针指向派生类对象ptr->show();  // 输出 "Derived":多态行为delete ptr;
}

如果不用指针,而是直接用对象,多态将不会生效:

Base obj = Derived();  // 对象切片(object slicing)
obj.show();  // 输出 "Base" 而不是 "Derived"

2.3 使用指针的其它优势

  • 可以轻松地传递对象到函数中(避免对象复制);

  • 能够管理对象生命周期;

  • 在容器中统一管理不同类型的对象指针(如抽象基类指针);

三、总结

场景描述
派生类访问基类成员直接在派生类中使用继承来的成员或方法
为什么用指针访问实现多态(虚函数),避免对象切片,统一接口管理对象
推荐用法:
  • 如果你需要多态,请使用基类指针或引用;

  • 如果只是继承成员、没有虚函数需求,可以直接使用对象访问继承来的成员;

底层了解

背景知识:什么是 vtable 和 vptr?

在 C++ 中,为了实现运行时多态(即虚函数机制),编译器通常采用以下技术:

名称含义
vtable(虚函数表)每个类都有一张表,存储着该类的虚函数地址
vptr(虚函数指针)每个对象中都有一个隐藏的指针,指向其类的 vtable

代码示例:虚函数、多态、vtable

#include <iostream>
using namespace std;class Base {
public:virtual void func1() { cout << "Base::func1()" << endl; }virtual void func2() { cout << "Base::func2()" << endl; }void normal() { cout << "Base::normal()" << endl; }
};class Derived : public Base {
public:void func1() override { cout << "Derived::func1()" << endl; }void func2() override { cout << "Derived::func2()" << endl; }void extra() { cout << "Derived::extra()" << endl; }
};int main() {Base* ptr = new Derived();  // 基类指针指向派生类对象ptr->func1();  // 调用 Derived::func1() —— 多态!ptr->func2();  // 调用 Derived::func2()ptr->normal(); // 调用 Base::normal() —— 非虚函数// ptr->extra(); // 错误:Base 类型中没有 extra()delete ptr;return 0;
}

输出:

Derived::func1()
Derived::func2()
Base::normal()

三、底层原理剖析

3.1 编译器的处理方式(伪代码/概念图)

步骤 1:编译器为每个类建立 vtable

Base_vtable:[0] => &Base::func1[1] => &Base::func2Derived_vtable:[0] => &Derived::func1[1] => &Derived::func2

步骤 2:每个对象内部添加一个隐藏指针 vptr

Base 对象:
+-----------+
| vptr ---> Base_vtable
+-----------+Derived 对象:
+-----------+
| vptr ---> Derived_vtable
+-----------+

步骤 3:调用虚函数时,编译器生成类似这样的代码:

// ptr->func1(); 实际代码类似于:
(*(ptr->vptr)[0])(ptr);  // 从 vtable 取出第一个函数指针调用

四、对象切片问题

Derived d;
Base b = d;  // 对象切片,Derived 部分被丢弃b.func1();   // 调用 Base::func1(),不是 Derived::func1()

因为 vptr 属于对象,当你把一个 Derived 对象赋值给 Base,只拷贝了 Base 的那部分数据(包括其 vptr),所以不会保留 Derived 的虚函数表指针。

五、vtable 可视化演示(示意图)

         +----------------+
Base*| vptr ----------+----> Base_vtable(原指向)|                |+----------------+   [0] → Base::func1[1] → Base::func2如果 ptr = new Derived();+----------------+
Base*| vptr ----------+----> Derived_vtable(多态关键)|                |+----------------+   [0] → Derived::func1[1] → Derived::func2

六、验证 vtable 的存在(高级)

在某些平台下你可以用强制类型转换,**“手动调用虚函数表中的函数”**来验证虚函数表存在(仅供理解用途):

typedef void(*Fun)();int main() {Derived d;Fun* vtable = (Fun*)*(long long*)&d;  // 获取 vptr,再转为函数指针数组vtable[0]();  // 调用 Derived::func1vtable[1]();  // 调用 Derived::func2
}

七、总结:指针 + 虚函数的意义

优点原因
实现运行时多态vtable + vptr
支持接口编程可定义抽象类,派生类实现后用基类指针操作
避免对象切片保留派生类的完整信息
动态绑定灵活程序运行时选择函数行为
http://www.dtcms.com/a/616450.html

相关文章:

  • 青岛php网站建设网站开发服务单位
  • 北海做网站公司网站聊天工具代码
  • 网站制作尺寸软件工程师报名官网
  • 网站式登录页面模板下载小程序开发教程资料
  • joomla 做的网站网络舆情事件
  • 做房地产用什么网站好深圳龙岗企业网站建设
  • 在线书店网站怎么做公司logo设计含义
  • 服务网点网站建设百度关键词推广条件
  • seo网站外链工具网站开发公司网站
  • 做目录网站注意可信网站认证查询
  • 商家自己做的商品信息查询网站网站建设背景及意义
  • 手机网站做落地页广州多区最新通告
  • gl账号注册网站广州外贸网站建设公司
  • 网站开发第几类商标做包装盒有哪些网站
  • 贵阳市网站做的最好的还原wordpress
  • 做公司的网站大概多少钱百度网站加v
  • 企业网站模板上一品资源做网站用到哪些软件
  • 电子商务网站建设做视频必须知道的一些网站
  • 网站安全建设进展情况汇报网站部署步骤网站开发
  • wordpress网站页面打开很慢网站建设初步策划方案
  • 怎样做网站网站ui用户界面设计
  • 廊坊北京网站建设濮阳网站建设哪家好
  • 网站开发实训指导书嘉兴网站建设公司电话
  • 常见的网站推广方式有哪些网站后台如何备份
  • 网站建设需要很强的编程沪尚茗居装修价格怎样
  • 国内建站平台有哪些网站模板怎样发布
  • 个人网站风格设计wordpress 忘记管理员密码
  • 操作系统分区
  • 谷歌云 wordpress 建站网站建设推广和网络推广
  • 网站改版seowordpress调用当前分类