首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

多态有关问题

2012-03-07 
多态问题 在线等以下程序为什么报错?includestdfax.h includeiostream usingnamespacestdclassanim

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

热点排行