关于派生。。。。
此程序是为了证明派生类不能访问基类的私有数据成员
#include<iostream>
using namespace std;
class Animal
{
public:
Animal(int Age):age(Age){}
//private:
int age; //已验证派生类不能访问私有数据,所以直接将其改成公有成员
};
class Dog:public Animal
{
public:
Dog();
void setWeight(float Weight) {weight=Weight;}
void setAge(int n) {age=n;} //老师要求以setAge函数来改变年龄,验证将age改为公有后才能访问
float getWeight() {return weight;}
int getAge() {return age;}
private:
float weight; //新增的数据成员
};
int main()
{
Dog dog;
dog.setAge(3);
dog.getAge();
dog.setWeight(4.5);
dog.getWeight();
cout<<"the weight of the dog is:\n"<<dog.getWeight()<<endl;
cout<<"the age of the dog is:\n"<<dog.getAge()<<endl;
return 0;
}
问题是:我直接这样编的时候编译能过,可是运行就出现这样的错误提示:error LNK2001: unresolved external symbol "public: __thiscall Dog::Dog(void)" (??0Dog@@QAE@XZ)
Debug/lab7_1.exe : fatal error LNK1120: 1 unresolved externals
而我将Animal(int Age):age(Age){}和Dog();注释掉后,又可以成功运行,这是为什么啊。。。。基类的构造函数不是不会被继承的不。。。
ps:
题目要求:定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。
[解决办法]
派生类必须负责基类对象的构造。
基类Animal有一个非默认的构造函数,所以构造Animal必须提供age参数
而派生类Dog的构造函数是默认的,没有参数,并且没有提供age参数给基类构造函数,所以出错。
解决的方法是:
1、Animal写一个默认构造函数(没有参数)
2、或者Dog写一个提供参数的构造函数,并在函数初始化列表中显式的构造Animal对象。
你的代码还有问题,既然基类有age这个成员变量,那么setage()和getage()放在基类实现更合理。
[解决办法]
添加 Animal(){}
Dog(); --> Dog(){}
[解决办法]
你屏蔽掉之后能跑,是因为你的父类和子类都没有构造函数了,编译器给你自动生产了默认构造函数,所以运行正常。
[解决办法]
这种问题对于初学者是很困难的,因为没有error,而是link问题,那么这时候你可以去查找他具体的问题描述,在这里就是public: __thiscall Dog::Dog(void) 说明编译器无法连接到Dog::Dog(void)这个函数的调用,即这个函数是未实现的函数,然后你就会找到问题的原因了