鱼C论坛

 找回密码
 立即注册
查看: 1451|回复: 13

[已解决]类方法与继承

[复制链接]
发表于 2018-12-20 09:07:08 | 显示全部楼层 |阅读模式

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

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

x
#include <iostream>
#include <string>

class Pet
{
public:
        Pet(std::string theName);

        void eat();
        void sleep();
        virtual void play();

protected:
        std::string name;
};

class Cat : public Pet
{
public:
        Cat(std::string theName);

        void climb();
        void play();
};

class Dog : public Pet
{
public:
        Dog(std::string theName);

        void bark();
        void play();
};

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

void Pet::eat()
{
        std::cout << name << "正在吃东西!\n";
}

void Pet::sleep()
{
        std::cout << name << "正在睡大觉!\n";
}

void Pet::play()
{
        std::cout << name << "正在玩儿!\n";
}

Cat::Cat(std::string theName) : Pet(theName)
{
}

void Cat::climb()
{
        std::cout << name << "正在爬树!\n";
}

void Cat::play()
{
        Pet::play();
        std::cout << name << "玩毛线球!\n";
}

Dog::Dog(std::string theName) : Pet(theName)
{
}

void Dog::bark()
{
        std::cout << name << "旺~旺~\n";
}

void Dog::play()
{
        Pet::play();
        std::cout << name << "正在追赶那只该死的猫!\n";
}

int main()
{
        Pet *cat = new Cat("加菲");
        Pet *dog = new Dog("欧迪");

        cat -> sleep();
        cat -> eat();
        cat -> play();

        dog -> sleep();
        dog -> eat();
        dog -> play();

        delete cat;
        delete dog;

        return 0;
}


在虚方法这一节中(其实不只是虚方法这一节,其他节也这么写);
void Dog::play()
{
        Pet::play();
        std::cout << name << "正在追赶那只该死的猫!\n";
}
子类Dog继承父类Pet的方式是先Pet::play();  ,在写自己的方法;
我的问题是为什么在子类中调用父类的方法可以是Pet::play(); 而不是Pet.play();
提问的原因是外部需要实例化才能调用,而且用.调用
故这里有此疑问
最佳答案
2018-12-20 12:16:25
如果用Pet.play(); 就需要new处一个pet对象才能.出对象的方法,因为没有对象所以只能用作用域::
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-20 10:17:41 | 显示全部楼层

回帖奖励 +10 鱼币

过来顶一下,我不是为了鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-20 12:16:25 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +10 鱼币

如果用Pet.play(); 就需要new处一个pet对象才能.出对象的方法,因为没有对象所以只能用作用域::
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-20 13:03:15 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-20 13:10:08 | 显示全部楼层

回帖奖励 +10 鱼币

顶  一定要顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-20 13:10:49 | 显示全部楼层
丶忘却的年少o 发表于 2018-12-20 12:16
如果用Pet.play(); 就需要new处一个pet对象才能.出对象的方法,因为没有对象所以只能用作用域::

那为什么在子类内可以用Pet::play()调用父类方法, 而在外部不可以?
class Pet
{
        void func1();
};

void Pet :: func1()
{
        std::cout << "aaaaa" << std::endl;
       
}




int main()
{
        Pet pet;
        Pet:: func1();
       
        return 0;       
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-20 15:03:36 | 显示全部楼层
自己顶一下吧。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-20 16:22:26 | 显示全部楼层

回帖奖励 +10 鱼币

顶顶顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-20 19:26:02 | 显示全部楼层

回帖奖励 +10 鱼币

本帖最后由 Croper 于 2018-12-20 19:34 编辑

类中的方法其实都是有一个指向自身的隐藏参数this的,比如说
 Dog::play()
其实是
 this->Dog::play()
。另外说一句,所谓常量成员函数就是把这个this用const给修饰了。所以,你在子类中写的
pet::play();//其实是下面这句
this->pet::play();//形参是基类,实参是派生类,没有问题
Pet.play();  //其实是下面这句
Pet->play(); //你把类型名拿来作为一个参数,编译器直接懵逼了,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-20 19:38:59 | 显示全部楼层

回帖奖励 +10 鱼币

那为什么在子类内可以用Pet::play()调用父类方法, 而在外部不可以?
class Pet
{
        void func1();
};

void Pet :: func1()
{
        std::cout << "aaaaa" << std::endl;
        
}




int main()
{
        Pet pet;
        Pet:: func1();
        
        return 0;        
}


同样的问题,你在外部调用是没有this指针的,那么这个Pet::func1()就少一个参数。。。另外,类默认是private,你不在前面加一个public是永远也用不出来的。。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
竟无语凝噎 + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-12-21 09:34:28 | 显示全部楼层
Croper 发表于 2018-12-20 19:38
同样的问题,你在外部调用是没有this指针的,那么这个Pet::func1()就少一个参数。。。另外,类默认是pr ...

十分感谢您的回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-21 09:41:05 | 显示全部楼层

回帖奖励 +10 鱼币

竟无语凝噎 发表于 2018-12-20 13:10
那为什么在子类内可以用Pet::play()调用父类方法, 而在外部不可以?
class Pet
{

子类:继承了父类,父亲的基因他也有,所以他能用父类的方法
外部:不好意思,你说的是谁?我不认识,你给我介绍以下( new 一个给他)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-21 09:48:14 | 显示全部楼层

回帖奖励 +10 鱼币

这必须顶!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-21 09:49:20 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-1 00:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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