简单工厂类,有继承、虚函数重写、基类指针指向子类对象会发生多态(1)

class Fruit
{
public:
    virtual void get_fruit()
    {
        std::cout<<"Fruit:getFruit"<<std::endl;
    }
};

class Pear : public Fruit
{
public:
    virtual void get_fruit()
    {
        std::cout<<"Pear:getFruit"<<std::endl;
    }
};

class Banana : public Fruit
{
public:
    virtual void get_fruit()
    {
        std::cout<<"Banana:getFruit"<<std::endl;
    }
};

//dependency
class Factory
{
public:
    Fruit* Create(char *name)   //简单工厂的创建工作 业务逻辑在里面
    {
        if(strcmp(name,"Pear")==0)
        {
            return new Pear();
        }
        else if (strcmp(name,"Banana")==0)
        {
            return new Banana();
        }
        else
        {
            return NULL;
        }
    }
};

工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好,当系统的具体产品不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不是很好。

原文地址:https://www.cnblogs.com/mathyk/p/9756347.html

时间: 2024-10-12 01:05:42

简单工厂类,有继承、虚函数重写、基类指针指向子类对象会发生多态(1)的相关文章

OOP2(虚函数/抽象基类/访问控制与继承)

通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当某个虚函数通过指针或引用调用时,编译器产生的代码直到运行时才能确定应该调用哪个版本的函数.被调用的函数是与之绑定到指针或引用上的对象的动态类型相匹配的那一个 注意:动态绑定只有当我们通过指针或引用调用虚函数时才会发生.当我们通过一个具有普通类型(非引用非指针)的表达式调用虚函数时,在编译时就会将调用

c++之虚函数和基类指针

1. 基类指针虽然获取派生类对象地址,却只能访问派生类从基类继承的成员 1 #include <iostream> 2 using namespace std; 3 4 //通过基类指针只能访问从基类继承的成员 5 class A 6 { 7 public: 8 A(char x) 9 { 10 this->x = x; 11 } 12 //void virtual who() //基类定义虚函数,则派生类的重定义版本默认为虚函数 13 void who() //除非定义虚函数,否则基类

基类与派生类,父类指针指向子类对象

先看一段代码: 1 #include<iostream> 2 3 using namespace std; 4 5 class Base{ 6 public: 7 Base() { cout<<"Base Creted"<<endl; } 8 ~Base() { cout<<"Base Destroyed"<<endl; } 9 }; 10 11 class Derived: public Base { 1

OC3-父类指针指向子类对象

// // Cat.h // OC3-父类指针指向子类对象 // // Created by qianfeng on 15/6/17. // Copyright (c) 2015年 qianfeng. All rights reserved. // #import "Animal.h" @interface Cat : Animal { float _height; } @property (assign,nonatomic)float height; @end // // Cat.m

构造函数为什么不能为虚函数 &amp;amp; 基类的析构函数为什么要为虚函数

一.构造函数为什么不能为虚函数 1. 从存储空间角度,虚函数相应一个指向vtable虚函数表的指针,这大家都知道,但是这个指向vtable的指针事实上是存储在对象的内存空间的.问题出来了,假设构造函数是虚的,就须要通过 vtable来调用,但是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数. 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到相应的调用.构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀.所以构造函数没有必要是虚

C# 继承后 函数重写父子类调用关系的逻辑

首先吐槽一下自己,做完实验之后,居然忘记到底是什么原因导致想搞清楚这个东西了.有点本末倒置. 首先一点,两种重写函数语法上的差异. new 是不看父类怎么写的,直接就写了.Override 是要父类声明 abstract virtual 之类可以重写的标签才能重写. 首先看看父类的结构 using System; namespace HixLearnCSharp { /// <summary> /// 爸爸类 /// </summary> class ParentClass { /

PoEduo - C++阶段班【Po学校】-继承&amp;虚函数&amp;抽象&amp;接口- 课堂笔记

附录(一) 扩展知识:  1--> 面向对象的三个基本特征   1.0 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,protected,public) 1.1 继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力).可视继承(子窗体使用父窗体的外观和实现代码).接口继承(仅使用属性和方法,实现滞后到子类实现).前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式. 1.3 多态:是将

c++虚函数实现与this指针

我们知道当我们sizeof 一个类的时候,类的成员函数是不计算在对象的大小的里的,这是为什么呢?因为类的成员函数不是属于某一个对象的,而是类的所有对象所共享的,就像static变量那样.如果虚函数和普通成员函数一样,那么我们就不能通过指向子类的基类指针来引用子类的方法了,因为我们将不知道调用哪个方法,多态就无从谈起.那么多态是怎么实现的呢? 虚函数.虚指针与虚表 我们可以做一个小实验 class A{ public: int a; virtual void myfun(){} }; class

【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态

实现基类(父类)以及派生类(子类),验证继承与转换--赋值兼容规则: 子类对象可以赋值给父类对象(切割/切片) 父类对象不能赋值给子类对象 父类的指针/引用可以指向子类对象 子类的指针/引用不能指向父类对象(可以通过强制类型转换完成) #include<iostream> using namespace std; class People    //父类或者基类 { public:     void Display()     {         cout << "_na