子类继承父类,但是每个子类又不能全部拥有基类的属性

编写一个动物基类,动物基类的属性有跑,飞,游泳三个,让猪、鱼、鸟这三个类继承动物类,但是每个对应的只能有自己特有的属性,比如猪肯定不能飞(飞猪?肥猪)!

#include "stdafx.h"
#include <iostream>
using namespace std;

enum ANIMAL_TYPES
{
    fish,
    bird,
    pig,
}; //枚举

template <ANIMAL_TYPES at>
class Animal
{
public:
    void swim();
    void fly();
    void walk();
};

template <>
void Animal<ANIMAL_TYPES::fish>::swim()
{
    cout << "fish:游泳!!!!!!"<<endl;
}

template <>     //模板的完全特化
void Animal<ANIMAL_TYPES::bird>::fly()
{
    cout << "bird:我要飞得更高!" << endl;
}

template <>
void Animal<ANIMAL_TYPES::pig>::walk()
{
    cout << "pig:老子散散步!!" << endl;
}

template <ANIMAL_TYPES at>
class Pig : public Animal<ANIMAL_TYPES::pig>
{
public:
    Pig(){}
    virtual~Pig(){}
};

template<ANIMAL_TYPES at>
class Fish : public Animal<ANIMAL_TYPES::fish>
{
public:

};

template <ANIMAL_TYPES at>
class Bird : public Animal<ANIMAL_TYPES::bird>
{
public:
};

int _tmain(int argc, _TCHAR* argv[])
{
    Pig<ANIMAL_TYPES::pig> onePig;
    onePig.walk();

    Bird<ANIMAL_TYPES::bird> oneBird;
    oneBird.fly();

    Fish<ANIMAL_TYPES::fish> oneFish;
    oneFish.swim();
//  oneFish.fly();//Error

    int a;
    cin >> a;
    return 0;
}

上面的方法主要用到了类模板成员函数的特化这个知识点;

基类Animal的三个普通成员函数 walk(),swim(),fly()都具有一个外围模板类即是Animal类,因此在实现的时候需要使用一个template<>前缀来声明:后面使用一个模板实参来对它进行全局特化,

template <>
void Animal<Animal::pig>::walk()
{
    cout << "pig:老子散散步!!" << endl;
}

前面template<>前缀

后面<ANimal::pig>进行全局特化

Fish<ANIMAL_TYPES::fish> oneFish;
    oneFish.swim();
//  oneFish.fly();//Error

oneFish这个对象虽然也有fly()属性,但是运行会报错,达到了我们需要的效果!

template<typename T>
class Quoter
{
public:
    void print()const
    {
        cout << "hhh" << endl;
    }
};
template<>
void Quoter<void>::print()const
{
    cout << "Quote<void>";
}

int _tmain(int argc, _TCHAR* argv[])
{
    Quoter<void> test;
    test.print();

    int a;
    cin >> a;
    return 0;
}

输出:Quote

时间: 2024-10-05 04:55:53

子类继承父类,但是每个子类又不能全部拥有基类的属性的相关文章

子类继承父类后想要扩展父类方法

1 >>> class PClass(object): 2 def setInfo(self,sex='Male'): 3 self.gender = sex 4 5 6 >>> class CClass(PClass): 7 def setInfo(self,who): 8 self.name = who 9 PClass.setInfo(self)#子类继承父类后想要扩展父类方法,若仍想保留父类方法可以通过回调 10 11 12 >>> x = C

关于子类继承父类的一个容易忽视的小细节

子类继承父类的时候对父类的属性有没有继承呢??(其实我自己刚学,一些细节的不是太清楚) 下面的代码会说明一个容易忽视的细节: 这是父类: public class FatherClass { int a = 10; public void fun(){ System.out.println("This is FatherClass funMothed!!"); }} 这是子类: public class Child extends FatherClass { int a = 20; p

子类继承父类传参01

python中子类继承父类(传参数与不传参数) Class A(object): def __init__(self,a='A'): print('Enter: ',a) print('Leave: ',a) Class B: def __init__(self,a=None): print('ENter B') super(B,self).__init__(a) print '111' b=B() print '222' b=B(123) 输出: 111 Enter B ('ENter: ',

UVM:9.1.5 子类继承父类的callback 机制

1.假如一个公司有前后两代产品,新的验证平台与旧的大部分一致,只是要扩展my_driver,即需要从my_driver 中派生一个新的类new_driver.还要保证第一代测试用例在尽量不改动的前提下在新的通过. 1)由于第一个callback 在声明的时候指明了这个池子只能用于my_driver,指明才能让new_driver用呢? 2.这要子类继承父类的callback.new_driver: 1)使用了uvm_set_super_type 宏,把子类和父类关联在一起.第一个是子类,第二个是

Java子类继承父类,当实例化子类对象时的执行顺序

子类继承父类,当实例化子类对象时,执行顺序如下:     父类层级静态块      自身静态块     父类块      父类构造器     自身块      自身构造器 由于继承,肯定应该先加载父类再加载子类,加载类自然会调用静态块,然后是调用父类的构造函数和子类的构造函数,不过构造函数调用前肯定要先调用域或块,这样才能正确创建对象. ················································赋值顺序如下:     父类的静态变量赋值     自身的静态变

js中的子类继承父类的方法和属性

上次讲了个简单的继承,这次 咱们讲个稍微复杂点的,那就是让子类继承父类的属性和方法,假设人 (Person)是父类,工人(Worker)是子类,让worker继承person的属性和方法: 父类: function Person(name,age) { this.name=name; this.age=age; } Person.prototype.showName=function() { alert(this.name); } function worker(name,age,job) {

子类继承父类的私有属性

最近学习继承,从书中看到子类继承父类,子类拥有父类所有的属性和方法,于是使用程序去验证,发现父类的私有属性和私有方法,子类是不能访问的,当然一些父类的私有属性可能可以通过相应的方法访问到,但是私有的方法似乎不能简单的访问,这里暂不考虑Java反射机制,于是我分析,子类不能继承父类私有的属性及方法,但是分析了内存后,我发现我是错的,在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.所以所谓的继承使子类拥有父类所有的属性和方法

python 子类继承父类__init__(转载)

转载: http://www.jb51.net/article/100195.htm 前言 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__方法在类的一个对象被建立时,马上运行.这个方法可以用来对你的对象做一些你希望的 初始化 . 注意:这个名称的开始和结尾都是双下划线. 父类A ? 1 2 3 4 5 6 class A(object):  def __init__(self, name):   self.name=name   prin

python之子类继承父类时进行初始化的一些问题

直接看代码: class Person: def __init__(self): self.name = "jack" class Student(Person): def __init__(self): self.school = "一中" stu = Student() print("学生的姓名是:",stu.name) 此时,程序是不能正常运行的,运行之后报错: 这是为什么呢? __init__相当于是python类的构造方法,在类进行实例