文章列表
有一个基类:
class Animal
{
public:
Animal();
void setWeight(float weight);
float getWeight();
private:
float weight;
}
有两个Animal类的派生类:
class ma:public Animal
{
public:
ma();
void run();
}
class lv:public Animal
{
public:
lv();
void roar();
}
定义一个派生类 luozi 继承 ma 和 lv
class ...
基类定义如下:
class Query{
public:
virtual Query *clone() = 0;
};
派生类定义如下:
class NameQuery : public Query
{
public:
virtual Query *clone()
{
return new NameQuery(*this);
}
};
Query *pq = new NameQuery();
Query *pq1 = pq->clone();//获取抽象基类的“拷贝”
#include <iostream>
class Base{
public:
virtual int foo( int ival = 1024 )
{
cout<<"Base::foo()----- ival: "<<ival<<endl;
return ival;
}
};
class Derived : public Base
{
public:
virtual int foo( int ival = 2048)
{
cout<<"Derived::foo()--- ...
以下类的定义只是为了说明虚拟机制而设计:
class Animal{
public:
int getNum();
}
class Bird : public Animal
{
public:
int getNum();
}
Animal *pa = new Bird();
1、pa->getNum();此时调用的是Animal类的getNum()
修改Bird类为:
class Bird : public Animal
{
public:
int getNum();
virtual int getAge();
}
2、pa-> ...
class Diff{
public :
void numble( int doftness );
}
class Shy : public Diff
{
public:
void numble( string str);
using Diff::numble;
}
要想使基类和派生类中的这两个函数形成重载:需要在派生类中加一句话
using Diff::numble; 这样就形成了重载。
c++支持多态性的几种方式:
1、通过一个隐式转化,从“派生类指针或引用”转化到“其公有基类类型的指针或引用”
Query *pquery = new NameQuery( "Glass" );
2、通过虚拟函数机制
3、通过dynamic_cast 和 typeid 操作符(RTTI)
1)首先这两个操作符是在“运行时刻类型识别”!
2)当一个类库是由第三方库提供商提供时,此时我们不能增加虚拟成员函数。但我们可能仍然希望扩展这个类库(以便增加类库的功能),这种情况下,就必须使用dynamic_cast。
使用dynamic_cast时注意:
如果转化 ...
定义类如下:
class Foo{
public:
static int getNum();
private:
static int num;
}
1、定义一个指针指向 类的数据成员 num
int Foo::*p = &Foo::num
2、定义一个指针指向 类的成员函数 getNum()
int (Foo::*pf)() = &Foo::getNum;
/*
int (Foo::*pf)() = &Foo::getNum;
Foo *bufFoo;
当通过指针访问类的成员函数getNum()时,应该这样写:
(bufFoo->* ...
1、静态数据成员的类型可以是其所属类,而非静态数据成员只能被声明为该类的对象的指针。
例如:
class Bar{
private:
static Bar mem;//正确
Bar mem1;//错误
Bar *mem2;//正确
}
2、静态数据成员可以被作为类成员函数的缺省实参,而非静态成员不能。
例如:
class Foo{
private:
static int stcvar;
public:
int mem( int = stcvar);
}
3、静态成员函数的使用:如果一个类的成员函数只访问静态变量,则应该将此函数声明为静态函数
class Screen{
public:
void home(){_cursor = 0;}
private:
int _cursor;
}
虽然每个类对象都有自己的类数据成员拷贝。但是每个类成员函数的拷贝“只有一份”!
例如:
Screen myScreen, groupScreen;
myScreen.home();
groupScreen.home();
其中myScreen, groupScreen调用home()时,调用的是同一个函数home()!
对于“成员函数”而言,const类对象只能调用const成员函数,(一般const成员函数不能修改类对 ...
Animal为基类,Bird为派生类
Bird继承Animal
当继承方式为public时
父类的public成员在子类也是public
父类的protected成员在子类也是protected
父类的private成员只属于父类
当继承方式为protected时
父类的public成员在子类是protected成员
父类的protected成员在子类也是protected
父类的private成员只属于父类
当继承方式为private时
父类的public成员在子类是private成员
父类的protected成员在子类是private成员
父类的priv ...
class First{
public:
int num = 0;//错误
const int num1 = 0;//错误
static int num2 = 0;//错误
static const int num3 = 0;//正确,只有静态常量整型数据成员才可以在类中初始化
string str = "0";//错误
const string str1 = "0";//错误
static string str2 = "0";//错误
static const string str3 = " ...
#include "stdafx.h"
#include <iostream>
using namespace std;
enum EHstate{ noErr, zeroOP,nega, severeError};
enum EHstate state = noErr;
int mathFunc(int i)
{
if(i == 0)
{
throw state;
}
}
void calculate(int op)
{
try
{
mathFunc(op);
}
catch(EHstate & ...
dynamic_cast:通常在父类与子类之间转化时使用,转化的类型和对象都是类对象,不能应用于c++内置类型static_cast:一般的类型转换,但不能将一个const对象转型为non-const对象(只有const_cast能做到)。const_cast:将一个const对象转型为non-const对象;reinterpret_cast:通常对于操作数的位模式执行一个比较低层次的重新解释。
char cal1[] = {'C','+','+'};//维数是3
char cal2[] = "c++";//维数是4
//char cal3[] = cal1;//不能用一个数组初始化另一个数组
//char &cal4[] = {'C','+','+'};//c++不允许数组引用
string *ps = new string("Hello World!");
delete ps;//此时ps为空悬指针,需将ps = 0;
ps = 0;//至此彻底收回 动态内存
int ival = 1024;
...
#include "stdafx.h"
#include <iostream>
#include <bitset>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
bitset<32> bitvec(8);
bool flag = bitvec.any();//判断是否存在某位或者多位为1,有则返回true
bool flag1 = bitvec.none();//判断是否所有的位都是0,是则返回true
bool flag2 = b ...