类方法与继承
#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();
提问的原因是外部需要实例化才能调用,而且用.调用
故这里有此疑问 过来顶一下,我不是为了鱼币{:5_108:} 如果用Pet.play(); 就需要new处一个pet对象才能.出对象的方法,因为没有对象所以只能用作用域:: {:5_95:} 顶一定要顶 丶忘却的年少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;
} 自己顶一下吧。。
顶顶顶 本帖最后由 Croper 于 2018-12-20 19:34 编辑
类中的方法其实都是有一个指向自身的隐藏参数this的,比如说 Dog::play()其实是 this->Dog::play()。另外说一句,所谓常量成员函数就是把这个this用const给修饰了。所以,你在子类中写的pet::play();//其实是下面这句
this->pet::play();//形参是基类,实参是派生类,没有问题而Pet.play();//其实是下面这句
Pet->play(); //你把类型名拿来作为一个参数,编译器直接懵逼了,
那为什么在子类内可以用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是永远也用不出来的。。 Croper 发表于 2018-12-20 19:38
同样的问题,你在外部调用是没有this指针的,那么这个Pet::func1()就少一个参数。。。另外,类默认是pr ...
十分感谢您的回复 竟无语凝噎 发表于 2018-12-20 13:10
那为什么在子类内可以用Pet::play()调用父类方法, 而在外部不可以?
class Pet
{
子类:继承了父类,父亲的基因他也有,所以他能用父类的方法
外部:不好意思,你说的是谁?我不认识,你给我介绍以下( new 一个给他) 这必须顶! {:10_256:}
页:
[1]