多态问题 在线等
以下程序为什么报错?
include "stdfax.h ";
include <iostream> ;
using namespace std;
class animal
{
public:
virtual void say() = 0;
}
class cat: public animal
{
public:
void say()
{
cout < < "hi! I am a cat ";
}
}
class dog: public animal
{
public:
void say()
{
cout < < "hi! I am a dog ";
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int which;
which = 0;
animal who;
if (which == 0)
who = new cat()
else
who = new dog;
who.say();
}
}
[解决办法]
问题多了。
class animal
{
public:
virtual void say() = 0;
};//少分号
class cat: public animal
{
public:
void say()
{
cout < < "hi! I am a cat ";
}
};//少分号
class dog: public animal
{
public:
void say()
{
cout < < "hi! I am a dog ";
}
};//少分号
int _tmain(int argc, _TCHAR* argv[])
{
int which;
which = 0;
animal* who;//应为指针类型
if (which == 0)
who = new cat;//少了个;
else
who = new dog;
who-> say();
//本来多了个}
}
[解决办法]
你在animal基类中定义了纯虚函数,这样的类属于接口不完全(say()函数没有定义实体),叫做抽象基类,按C++规范抽象类是不能产生对象实例的,故而animal who;不为编译器所允许。
[解决办法]
我是想在who = new cat()中对它进行初始化的。
-----------------
C++与C#不同,在定义animal who;时系统就已经调用该类的构造函数了,只是,构造不起来呀。
[解决办法]
iambic的解法也不对啊,定义一个基类对象的指针怎么能让该指针指向子类呢???
如果是
cat *p = new cat;
animal *q = new animal;
p = q;//可以
q = p;//似乎不行吧???
[解决办法]
子类派生于基类,基类的指针当然可以调用期成员函数了。
事实上通过指针或引用调用派生类改写的虚拟函数,正是C++多态性的极大体现。
[解决办法]
#include "stdfax.h "; // 这个应该是 #include "stdafx.h "
#include <iostream> ; // include 后面不需要 ; 号
using namespace std;
class animal
{
public:
virtual void say() = 0;
} // 这里少了个 ;
class cat: public animal
{
public:
void say()
{
cout < < "hi! I am a cat ";
}
} // 这里少了个 ;
class dog: public animal
{
public:
void say()
{
cout < < "hi! I am a dog ";
}
} // 这里少了个 ;
int _tmain(int argc, _TCHAR* argv[])
{
int which;
which = 0;
animal who; // 纯虚类不能实例化,应该是指针 animal* who;
if (which == 0)
who = new cat() // 这里少了个 ;
else
who = new dog;
who.say(); // 指针用 -> 访问 who-> say();
}
} // 这里多了个大括号 }
------------
更改后
#include "stdafx.h "
#include <iostream>
using namespace std;
class animal
{
public:
virtual void say() = 0;
};
class cat: public animal
{
public:
void say()
{
cout < < "hi! I am a cat ";
}
};
class dog : public animal
{
public:
void say()
{
cout < < "hi! I am a dog ";
}
};
int _tmain(int argc, _TCHAR* argv[])
{
int which;
which = 0;
animal* who;
if (which == 0)
who = new cat();
else
who = new dog;
who-> say();
}
[解决办法]
发贴还重新打一遍啊? 怎么不ctrl cv
你的基类的say() 是纯虚函数, 纯虚函数与虚函数不同
有纯虚函数的类叫抽象类,抽象类是不能被实例化的
既然你学过C#,你可以把他理解为接口,他只能被子类继承
并实现(如果没实现纯虚函数则该类仍然为抽象类)
你想体现多态性就改为
virtual void say() = 0; --> virtual void say() {cout < < "I am an animal! "};
C#的 new 返回的是指向一个实例的引用
C++ new 返回的是指向一个实例的指针
所以
animal* who;
who = new cat();