读书人

多态有关问题

发布时间: 2012-03-07 09:13:51 作者: rapoo

多态问题 在线等
以下程序为什么报错?
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();

读书人网 >C++

热点推荐