鱼C论坛

 找回密码
 立即注册
查看: 4370|回复: 2

C++中关于子类继承基类中的参数变量问题

[复制链接]
发表于 2012-10-4 16:44:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
#include <string>

class Company
{
public:
        Company(std::string theName);
        virtual void printInfo();

protected:
        std::string name;
};

class TechCompany:public Company
{
public:
        TechCompany(std::string theName,std::string product);
        virtual void printInfo();
       
private:
        std::string product;
};

Company::Company(std::string theName)
{
        name = theName;
}

void Company::printInfo()
{
        std::cout<<"这个公司的名字叫:"<<name<<"。\n";         
}

TechCompany::TechCompany(std::string theName,std::string product):Company(theName)
{
        this->product = product;
}

void TechCompany::printInfo()
{
        std::cout<< name << "公司大量生产了" << product << "这款产品!\n";
}

int main(int argc, char *argv[])
{
        Company *company = new Company("Apple");
        company ->printInfo();
       
        delete company;
        company = NULL;
       
        company = new TechCompany("Apple","Iphone 5");
        company ->printInfo();
       
        delete company;
        company = NULL;
         
        return 0;
}
        新手学习C++,请教一下,上面红色的一段,我大概知道是为了使得调用子类的构造函数时使用从基类继承来的theName这个属性,请问这个东西为什么用一个:加上函数这么写,究竟是为了实现什么,求达人解答!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-4 20:03:51 | 显示全部楼层
子类的对象必定包含基类对象的部分。但是,子类对象不能亲自初始化基类对象部分,所以子类对象的构造函数以开始必须要调用基类构造函数来初始化基类对象,如LZ红色字体处的:Company(theName) 就是以theName作为参数调用基类构造函数,初始化基类部分。

原则上说,只要程序员能够保证将调用基类构造函数的语句写在子类构造函数的第一句,就没什么问题。但最大的问题在于很多程序员会忘记写,这样基类对象就没有初始化了。于是C++编译器决定帮助我们完成这个事情。于是就有了所谓的“初始化列表”,其实C++编译器读取“初始化列表”后,将产生对应的代码,插入子类构造函数的最开头。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-4 21:10:34 | 显示全部楼层
多谢版主解答,我明白了,呵呵!
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-10 03:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表