您的位置:首页 > 编程语言 > C语言/C++

Java中abstract抽象类 / abstract抽象方法 和C++的对比

2012-12-05 17:21 627 查看
JAVA:
abstract抽象类不能用new实例化对象,abstract方法只允许声明不能实现。
如果一个类中含有abstract方法,那么这个类必须用abstract来修饰,当然abstract类也可以没有abstract方法。
eg.
C:\Users\Administrator\Desktop\9999.jpg

//抽象类
abstract class Graph
{
public abstract void Show();

public void Func()
{
System.out.println("I am Graph!");
}
}

class Circle extends Graph
{
public void Show()
{
System.out.println("I am a circle!");
}
}

public class Five
{
public static void main(String args[])
{
Graph g;
g = new Circle();
g.Show();
}

}

NOTE:
Java中的多态和C++中多态类似, 但是也有不同,Java中没有指针的概念,因此实现多态是用子类对象给父类对象赋值。
C++中实现多态是用虚函数实现,用子类对象的地址给父类指针赋值,形如Father *pF = new Son(para1, pra2,..),
pF->Func(paras..);
Java和C++中抽象类都可以有构造函数和成员变量,只是抽象类不可以实例化对象。
另外:C++中经过实验发现另外一个问题,在下面例子中说明

//图片,桌面167-1 167-2

#include <iostream>
using namespace std;

class Father
{
protected:
int a;

public:
virtual void Func() const = 0; //纯虚函数,此类为抽象类
Father(int a) //抽象类的构造函数
{
this->a = a;
}

void Show()
{
cout<<"Father a = "<<a<<endl;
}

};

class Son1 : public Father //子类
{
protected:
int a; //同名覆盖

public:
Son1(int fa, int a) : Father(fa) //构造函数
{
this->a = a;
}
virtual void Func() const //带const的虚函数A
{
cout<<"I am Son1"<<endl;
}

/*virtual*/ void Func() //不带const的函数B
{
cout<<"虽然本类中有个和我类似名字函数,但是还是不一样的!"<<endl;
}

void Show2()
{
Show();
cout<<"Son1 a = "<<a<<endl; //默认是子类的成员变量a
cout<<Father::a<<endl; //表明是父类的成员变量a
}

};

int main()
{
Father *pF = NULL;
Son1 son1(10, 20);
pF = &son1;

pF->Func(); //通过父类指针调用的是子类虚函数A
son1.Show2();
son1.Func(); //通过子类对象调用的是子类(虚)函数B,B函数带不带virtual结果一样

pF->Show2(); //错误的调用,父类中并没有名为Show2的函数
pF->Show();
return 0;
}
结果



说明:上例中,需要注意的是①多态的实现是通过虚函数,即用父类指针指向子类对象,再通过父类指针调用虚函数,
该虚函数如果是父类子类都有的(子类重写或定义了父类的纯虚函数),那么会自动调用子类的该函数,否则调用
的是父类的函数。 即用父类指针调用的函数必须是在父类中存在的,而运行阶段再会根据虚函数表决定调用父类
或子类的该函数 或者 哪个子类的该函数! 这点可通过上例中”错误的调用“来体现!

②对于上例中Func函数A和B,之所以能够在运行阶段区分是因为虚函数表的原因(个人见解,多态),而后者则不是。
在其他情况下则不能这样写在一起。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐