2 u014327136 u014327136 于 2016.09.14 19:37 提问

C++纯虚函数问题请指教

#include
#include
using namespace std;

class Toy {
public:
virtual void talk() const=0;
};

class Dog: public Toy {
// Write your code here
public:
void talk()
{
cout<<"Wow"<<endl;
}
};

class Cat: public Toy {
// Write your code here
public:
void talk()
{
cout<<"Meow"<<endl;
}
};

class ToyFactory {
public:
/**
* @param type a string
* @return Get object of the type
/
Toy
getToy(string& type) {
// Write your code here
if(type=="Dog")
{
Dog d;
return d;
}
if(type=="Cat")
{
Cat *c;
return c;
}
}
};
int main()
{
string type;
type="Dog";
ToyFactory
tf = new ToyFactory();
Toy* toy = tf->getToy(type);
toy->talk();
return 0;
}

3个回答

weak_ptr
weak_ptr   2016.09.14 20:26
已采纳

上代码。

 #include <iostream>
 #include <string>
 #include <memory>



using namespace std;
class Toy {
public:
    virtual void talk() const = 0;
};
class Dog : public Toy {
    // Write your code here
public:
    void talk() const { cout << "Wow" << endl; }
};
class Cat : public Toy {
    // Write your code here
public:
    void talk() const { cout << "Meow" << endl; }
};
class ToyFactory {
public:
    /**
    * @param type a string
    * @return Get object of the type
    */
    unique_ptr<Toy> getToy(string &type) {
        // Write your code here
        if (type == "Dog") {
            return unique_ptr<Dog>(new Dog);
        }
        if (type == "Cat") {
            return unique_ptr<Cat>(new Cat);
        }
    }
};
int main() {
    string type;
    type                = "Dog";
    ToyFactory *    tf  = new ToyFactory();
    unique_ptr<Toy> toy = tf->getToy(type);
    toy->talk();
    return 0;
}

主要是以下问题:
1,Dog/Cat类型talk方法的签名和Toy的talk方法签名不一致,Toy的签名是void talk() const,注意const
2,getToy方法不应该返回Toy类型,因为Toy是一个不能实例化的抽象类。返回Toy类型的指针,应当return new Dog;return new Cat;,窝这里使用了unique_ptr,不用在意。
3,ToyFactory tf = new ToyFactory应该是ToyFactory *tf,注意new 返回的是指针。

u014327136
u014327136 嗯嗯,看程序的确不太明白,不过他说的很清楚,谢谢!
接近 2 年之前 回复
u014327136
u014327136 非常谢谢,能正常运行了,获益颇多
接近 2 年之前 回复
u014559880
u014559880 你使用智能指针反而会让题主更加迷惑吧
接近 2 年之前 回复
u014327136
u014327136   2016.09.14 19:39

运行后出错,不知道什么原因,请各位大大指教

u014559880
u014559880   2016.09.14 20:27

你确定你是运行出错?
这代码根本无法编译好吗?
可以改为:
Toy* getToy(string& type) {
// Write your code here
if(type=="Dog")
{
Dog* d=new Dog;
return d;
}
if(type=="Cat")
{
Cat *c=new Cat;
return c;
}
}
};

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
余生请多指教
青青子衿,悠悠我心。 可能形容我对CSDN的情感极好不过了。 余生,请多指教。
请多提点,请多指教
   在这里首先感谢一下,我在朋友的指引下登录本网站,发现这里正是我所需要的平台,有了这个平台,就有了我提高的机会,希望各位前辈能多多提点,请多指教,大家互相帮助,互相交流. 
虚基类 、 纯虚函数和抽象类
 虚基类                 在《多继承》中讲过的例子中,由类A,类B1和类B2以及类C组成了类继承的层次结构。在该结构中,类C的对象将包含两个类A的子对象。由于类A是派生类C两条继承路径上的一个公共基类,那么这个公共基类将在派生类的对象中产生多个基类子对象。如果要想使这个公共基类在派生类中只产生一个基类子对象,则必须将这个基类设定为虚基类。                 虚基类的引
C/C++ :C++实函数、虚函数、纯虚函数、函数重写
C++实函数、虚函数、纯虚函数、函数重写 和以前一样,先做好准备g
c++中纯虚函数的意义和作用
纯虚函数在基类中声明,在调用父类的纯虚函数,会在子类中是实现,。。。。。。待续,完善
用asp.net编写的在线考试系统
请指教,请指教,请指教,请指教,请指教,请指教,请指教,请指教,请指教,
C++中的虚函数和纯虚函数用法
使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。 如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数(方法)设为virtual 函数名=0 我们把这样的函数(方法)称为纯虚函数。 也就是说,虚函数 ,子类可以不重写,直接继承父类 的方法来使用,也可以重写 但是 纯虚函数是子类是必须重写了才可以使用 虚函数是为了实现多态性:
C++中虚函数与纯虚函数以及虚继承的相关知识
这篇文章主要利用网上的博客,经过自己的总结写成,不免出现错误情况,如有错误,请指正。 虚函数 首先是虚函数的意义。在面向对象的设计思想中,虚函数的作用是实现多态性。如何实现多态呢?下面看C++虚函数表的解析来理解。 虚函数表    http://blog.csdn.net/haoel/article/details/1948051/ 对C++ 了解的人都应该知道虚函数(Virt
C++中纯虚函数的实现原理是什么,为什么该纯虚函数不能实例化?
虚函数的原理采用 vtable,定义后必须。 那么类中含有纯虚函数时,其vtable 不完全,有个空位。 即“纯虚函数在类的vftable表中对应的表项被赋值为0。也就是指向一个不存在的函数。由于编译器绝对不允许有调用一个不存在的函数的可能,所以该类不能生成对象。在它的派生类中,除非重写此函数,否则也不能生成对象。”
用C写的 贪吃蛇
用C语言写的,VC编译,欢迎试玩,附源码,有问题请指教